Vue双向绑定原理

Vue是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

发布者-订阅者模式(MVVM双向绑定)

1、实现一个数据监听器Observer,劫持并监听所有属性,如有变动可拿到最新值并通知订阅者
2、实现一个指令解析器Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数
3、实现一个Watcher,作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图
4、mvvm入口函数,整合以上三者
Vue双向绑定原理

一、Observer

①把一个普通的 JavaScript 对象传入 Vue 实例作为 data 选项,Vue 将遍历此对象所有的属性,并通过 Object.defineProperty() 方法设置属性的 setter 与 getter 方法。(数据劫持)
②实现一个订阅者 Dep ,它的主要作用是用来存放 Watcher 观察者对象。(依赖收集)
③状态变化后,setter触发Dep对象的notify方法来通知所有的Watcher对象更新。
Vue双向绑定原理

二、Compile

compile主要做的事情是解析模板指令,将模板中的变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加监听数据的订阅者,一旦数据有变动,收到通知,更新视图。
Vue双向绑定原理

三、Watcher

1、在自身实例化时往属性订阅器(dep)里面添加自己
2、自身必须有一个update()方法
3、待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调。