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 对于数组的变动也能监听到,不须要深度遍历监听。