We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
总的来说数据劫持结合发布者-订阅者模式
通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。
vue的数据双向绑定将MVVM作为数据绑定的入口,整合Observer,Compile和Watcher三者,通过Observer来监听自己的model的数据变化,通过Compile来解析编译模板指令(vue中是用来解析 {{}}),最终利用watcher搭起observer和Compile之间的通信桥梁,达到数据变化 —>视图更新;视图交互变化(input)—>数据model变更双向绑定效果。
极简版双向数据绑定:
<body> <div id="app"> <input type="text" id="txt"> <p id="show"></p> </div> </body> <script type="text/javascript"> var obj = {} Object.defineProperty(obj, 'txt', { get: function () { return obj.text || '' }, set: function (newValue) { obj.text = newValue document.getElementById('txt').value = newValue document.getElementById('show').innerHTML = newValue } }) document.addEventListener('keyup', function (e) { obj.txt = e.target.value }) </script>
The text was updated successfully, but these errors were encountered:
由于Object.defineProperty()对于引用类型的一些不足:
双向绑定的Proxy版本:
<body> <input type="text" id="model" /> <p id="word"></p> <script> const input = document.getElementById('model'); const word = document.getElementById('word'); const newObj = new Proxy({}, { get: function (target, key, receiver) { console.log(`get ${key}`); console.log(target, key, receiver); return Reflect.get(target, key, receiver); }, set: function (target, key, value, receiver) { console.log(`set ${key} = ${value}`); console.log(target, key, value, receiver); if (key === 'text') { input.value = value; word.innerText = value; } return Reflect.set(target, key, value, receiver); } }) input.addEventListener('keyup', function (e) { newObj.text = e.target.value; }) </script> </body>
Sorry, something went wrong.
No branches or pull requests
总的来说数据劫持结合发布者-订阅者模式
通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter。用户看不到 getter/setter,但是在内部它们让 Vue 追踪依赖,在属性被访问和修改时通知变化。
vue的数据双向绑定将MVVM作为数据绑定的入口,整合Observer,Compile和Watcher三者,通过Observer来监听自己的model的数据变化,通过Compile来解析编译模板指令(vue中是用来解析 {{}}),最终利用watcher搭起observer和Compile之间的通信桥梁,达到数据变化 —>视图更新;视图交互变化(input)—>数据model变更双向绑定效果。
极简版双向数据绑定:
The text was updated successfully, but these errors were encountered: