vue双向绑定原理

Vue 双向绑定原理是通过数据劫持结合发布者-订阅者模式来实现的。以下是对Vue双向绑定原理的详细解释:

image-20241109181601810

  1. 数据劫持(Data Reactivity):
    • Vue使用 Object.defineProperty(Vue 2.x)或 Proxy(Vue 3.x)方法来劫持各个属性的setter和getter。
  2. 依赖收集(Dependency Tracking):
    • 当数据被读取时( getter 被调用),Vue 会对组件实例数据进行依赖收集,创建一个Watcher,并将数据跟Watcher进行绑定,将Watch(一个属性访问一次对应一个Watcher,也就是订阅者,里面存放着更新函数)存储到Dep中(消息中心,用来管理Watcher,一个Watcher对应一个Dep,但是相同属性在页面中存在多次的话,会将多个Watcher放在同一个Dep中),以便之后能够触发更新。
  3. 派发更新(Dispatching Updates):
    • 当数据变化时(setter 被调用,也就是发布者),Vue 会遍历Dep(消息中心),通知所有依赖于这个数据的Watcher,并调用它的更新函数,重新渲染组件。
  4. 指令系统(Directive System):
    • Vue 的 v-model 指令用于创建双向数据绑定。在内部,Vue 会为 v-model 绑定的 input 元素添加事件监听器(通常是 input 事件)。
    • 当输入事件触发时,Vue 会执行绑定的事件处理器,这个处理器会更新组件的数据,从而间接更新数据对象。
  5. 渲染函数(Render Functions):
    • Vue 将模板通过AST转换为渲染函数,这个函数能够返回虚拟 DOM 树,包括创建虚拟节点(VNode),以及对数据变化的响应逻辑。
    • 当数据变化时,Vue 会重新执行渲染函数,生成新的虚拟 DOM 树,并与旧的虚拟 DOM 树进行比较,然后更新实际的 DOM。
  6. 异步更新队列(Async Update Queue):
    • Vue 在同一事件循环中可能会遇到多次数据变化,为了避免不必要的重复渲染,Vue 会将所有数据变化收集到一个异步队列中。
    • 在下一个事件循环“tick”中,Vue 刷新队列并执行实际的 DOM 更新。

发布者-订阅者模式

  • Observer(监听器):Observer负责监听模型数据的变化,当数据发生变化时,它会通知订阅者。
  • Watcher(订阅者):Watcher作为连接Observer和Compile的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图。
  • Dep(消息中心):Dep是一个消息中心,用来管理多个Watcher,确保数据变化时能够通知所有相关的Watcher。

MVVM架构

  • ViewModel:ViewModel负责将模型和视图关联起来,实现数据的双向流动。它包含两个主要部分:监听器(Observer)和解析器(Compiler)。监听器负责监听模型数据的变化,而解析器则负责解析视图中的指令,并根据指令模板替换数据,同时绑定更新函数。

双向绑定的原理是什么?

通常使用v-model这个指令实现双向绑定,放在input这样的输入元素上

在编译的时候解析出这个v-model

  1. 在当前这个元素上面加了事件监听,把v-model的回调函数作为事件监听的回调函数
  2. 如果input值发生变化的时候,就能把最新的值设置到vue实例上,因为vue实例已经实现了数据响应化,setter函数会通知Watcher进行更新操作,从而界面中所有相关依赖的数据都进行了更新。

Vue 的双向绑定实现机制确保了视图和数据之间的同步,同时避免了直接操作 DOM 的需要,这使得我们可以更加专注于应用逻辑,而不是数据和视图之间的同步问题。


vue双向绑定原理
https://thaneyang.github.io/2024/06/vue双向绑定原理.html
作者
ThaneYang
发布于
2024年6月18日
许可协议