Vue.js实现双向数据绑定是基于数据劫持和发布-订阅模式。使用Object.defineProperty()劫持每个属性的setter和getter,当数据发生变化时向订阅者发布消息,并触发相应的监听回调。第一步需要递归遍历观察者(datalistener)的数据对象,包括子属性对象的属性,加上getters和setters。这样,当给这个对象赋值时,就会触发setter,可以**监听到数据的变化。如果有变化,可以获得最新的值,并通知订阅者。**第二步,**compile()解析Template指令**,将template中的变量替换成数据,然后初始化渲染页面视图,给每条指令对应的节点绑定一个update函数,添加一个监听的订阅者到数据,一旦数据发生变化,就会收到通知并更新视图。第三步:watcher,订阅者是Observe和Compile之间的沟通桥梁。主要做的事情是:能够订阅接收每次属性变化的通知,并执行绑定到命令上的相应回调函数来更新视图。第四步:MVVM作为数据绑定入口,集成Observer、Compile和Watcher,通过Observer监听自身模型数据变化,通过Compile解析编译模板指令,最后使用Watcher建立Observer和Compile的关系。通讯桥实现数据变化->尝试更新;尝试与变化交互(输入)->数据模型变化的双向绑定效果。在vue3.0中使用proxy代替defineProperty。Proxy也可以在不需要深度遍历监控的情况下监控数组的变化。
