Vue的双向绑定原理主要依赖数据劫持和自动更新机制,通过Observer、Dep、Watcher和Compile等组件协作实现数据与视图的自动同步。其核心流程可分为以下四个部分:
1. 数据劫持与响应化Vue 2通过Object.defineProperty对data对象中的每个属性进行劫持。初始化时,Observer类递归遍历data,为每个属性定义getter和setter:
- getter:在属性被访问时触发,调用dep.depend()将当前激活的Watcher(通过Dep.target标记)加入依赖队列,实现依赖收集。
- setter:在属性被修改时触发,调用dep.notify()通知所有订阅该属性的Watcher执行更新。这一机制确保了数据访问和修改时能自动追踪依赖关系。
2. 依赖收集与通知机制依赖管理由Dep类完成,其核心功能包括:
- 订阅管理:Dep维护一个Watcher数组,记录所有依赖该数据的观察者。
- 触发依赖:当getter被调用时,dep.depend()检查Dep.target(当前激活的Watcher),若存在则将其加入依赖列表。
- 通知更新:当setter被调用时,dep.notify()遍历所有Watcher,调用其update()方法触发更新。例如,模板中引用{{message}}时,message的getter会收集对应的Watcher;数据修改后,setter通知该Watcher重新渲染视图。
3. 编译与指令解析Compile类负责解析模板,将动态数据绑定转换为响应式更新:
- 扫描模板:遍历DOM节点,识别插值表达式(如{{}})和指令(如v-model、v-bind)。
- 创建Watcher:为每个动态绑定创建Watcher实例,关联数据属性与更新函数(如重新渲染DOM)。
- 绑定事件:对输入框等表单元素,通过v-model语法糖监听输入事件,调用数据属性的setter更新数据。例如,<input v-model="message">会被解析为同时监听输入事件(更新数据)吵码和订阅数据变搭碰含化(更新视图)。
4. 双向绑定流程双知笑向绑定的完整流程如下:
- 初始化阶段:new Vue()触发Observer对data响应化,同时Compile解析模板并创建Watcher。
- 数据更新视图:数据变化时,setter通过Dep通知Watcher,执行更新函数(如重新渲染DOM)。
- 视图更新数据:用户操作视图(如输入框输入)时,通过指令监听事件,调用数据属性的setter更新数据,进而触发依赖通知。
关键组件协作- Observer:监听数据变化,触发setter。
- Dep:管理Watcher订阅关系,协调通知。
- Watcher:订阅数据变化,执行更新逻辑。
- Compile:解析模板,建立数据与视图的绑定。
这一机制通过数据劫持、依赖收集和自动更新,实现了数据与视图的双向同步,是Vue响应式系统的核心。