1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| <!DOCTYPE html> <html lang="en">
<head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>简单实现vue响应式</title> </head>
<body> <div class="p"></div> <script> function defineReactive(obj,key,val,cb,newval) { Object.defineProperty(obj,key,{ enumerable:true, configurable:true, get: ()=>{ return val; }, set: newval => { if(newval!==val) { val = newval; } cb(); } }) } class Vue{ constructor(options) { console.log(1); this._data = options.data; observe(this._data,options.render); } } let app = new Vue({ el: '#app', data: { text: 'text', text2: 'text2' }, render(){ console.log('this'); } }) function observe(value,cb) { Object.keys(value).forEach((key) => { defineReactive(value, key, value[key] , cb)}) } app._data.text2 = 'ceshi'; console.log(app._data.text2); document.querySelector(".p").append(app._data.text2+'---'+app._data.text); </script> </body> </html>
|