Vue.js实现双向数据绑定是基于数据劫持和公布订阅模式的。
通过Object.defineProperty()来劫持各个属性的setter和getter,在数据变动时公布音讯给订阅者,触发相应的监听回调。第一步,须要observe(数据监听器)的数据对象进行递归遍历,包含子属性对象的属性,都加上getter和setter。这样当给这个对象的某个值赋值时,就会触发setter,就能**监听到数据变动,如有变动可拿到最新值并告诉订阅者**第二步,**compile()解析模板指令**,将模板中的变量替换成数据,而后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,增加监听数据的订阅者,一旦数据有变动,收到告诉,更新视图。第三步:watcher,订阅者是Observe和Compile之间通信的桥梁,次要做的事件是:可能订阅订收到每个属性变动的告诉,执行指令绑定的相应回调函数,从而更新视图。第四步:MVVM作为数据绑定的入口,整合Observer、Compile和Watcher三者,通过Observer来监听本人的model数据变动,通过Compile来解析编译模板指令,最终 利用Watcher搭起Observer和Compile之间的通信桥梁达到数据变动 -> 试图更新;试图交互变动(input) -> 数据model变更的双向绑定成果。在vue3.0中应用proxy代替了defineProperty,proxy对于数组的变动也能监听到,不须要深度遍历监听。