Observer(监听器)会递归遍历数据对象,通过Object.defineProperty将每个对象属性添加setter、getter方法,并且单独给每个属性创建一个dep(依赖收集器)实例,Compile 遍历 DOM,解析指令,如 v-model 和 v-bind为每个解析到的指令创建对应的 Watcher,并添加到对应属性的 Dep 中Observer监听到数据变化会通知对应的dep对象,dep 根据通知找到对应的一组 Watcher,并调用它们的 update 方法来更新视图。
当用户与页面上的表单元素交互时,事件监听器(如 v-model 的输入监听器)触发并修改 data 对象的值,由于表单元素绑定了 data 对象的某个属性,因此修改 data 的值会触发该属性的 setter、getter方法,通知对应的dep对象,dep 根据通知找到对应的一组 Watcher,并调用它们的 update 方法来更新视图的另一处属性引用。
那么双向数据绑定又与响应式有什么区别呢?
上面的双向数据绑定里,数据驱动实图的过程就是响应式,响应式通过数据区驱动DOM视图的变化是单项的。可以讲双休数据绑定是根据响应式原理来实现的,但是响应式不仅仅体现在在双向数据绑定里。