1

image.png

Vue.js 是一个流行的前端框架,以其简洁、高效和易用性著称。Vue 2 引入了响应式系统,该系统能够自动追踪数据的变化,并在数据变化时更新视图。这一系统的核心组件包括 Observer、Dep 和 Watcher。在本文中,我们将深入探讨这些组件的工作原理。

Observer:数据观测者

Observer 是响应式系统的数据观测者,它负责将普通的 JavaScript 对象转换成响应式对象。这个过程主要通过递归遍历对象的属性,并使用 Object.defineProperty 重新定义每个属性的 setter 和 getter 来实现。

当属性的 setter 被调用时,它会通知所有依赖于该属性的 Watcher 更新视图;当属性的 getter 被调用时,Observer 会记录依赖于该属性的 Watcher,以便在属性变化时通知它们。

Dep:依赖收集器

Dep 是依赖收集器,它的职责是收集所有依赖于某个响应式属性的 Watcher。在属性的 getter 中,Dep 会记录所有访问该属性的 Watcher,并将它们存储在一个数组中。

当响应式属性发生变化时,Dep 会遍历存储的 Watcher 列表,并通知它们进行更新。这样,Watcher 就可以重新计算表达式的值,并将结果更新到视图中。

Watcher:视图更新者

Watcher 是视图更新者,它负责将响应式属性的值与视图层绑定。Watcher 的核心工作流程包括:

  1. 初始化:在初始化时,Watcher 会执行一次属性的 getter,以收集依赖,并缓存属性的当前值。
  2. 计算:当依赖的响应式属性发生变化时,Watcher 会重新执行属性的 getter,计算新的值。
  3. 更新视图:计算出新的值后,Watcher 会将这个值更新到视图层,从而触发视图的重新渲染。

Watcher 还支持异步更新,以提高性能。在同一个事件循环中,如果响应式属性被多次修改,Watcher 会将这些修改汇总到下一个事件循环中,只执行一次视图更新。

响应式系统的工作原理

Vue 2 的响应式系统工作原理可以概括为以下几个步骤:

  1. 创建响应式对象:Vue 使用 Observer 将组件的 data 选项中的对象转换成响应式对象。
  2. 依赖收集:在组件的模板或计算属性中访问响应式属性时,它们的 getter 会被调用,触发 Dep 的依赖收集。
  3. 创建 Watcher:Vue 为每个组件创建一个或多个 Watcher,用于监听响应式属性的变化。
  4. 变更通知:当响应式属性的 setter 被调用,触发属性变化时,Observer 通知 Dep,由 Dep 通知所有依赖于此属性的 Watcher。
  5. 视图更新:Watcher 收到通知后,重新计算并更新视图。

结论

Vue 2 的响应式系统是其核心特性之一,它通过 Observer、Dep 和 Watcher 这三个组件实现了对数据变化的自动追踪和视图更新。理解这些组件的工作原理,有助于我们更好地使用 Vue,以及在必要时对其进行定制和扩展。

响应式系统的设计展示了 Vue 的设计理念:简洁、高效和易于理解。随着前端技术的不断发展,Vue 也在不断进化,其后续版本 Vue 3 引入了基于 ES6 Proxy 的响应式系统,进一步提升了性能和可维护性。但不论技术如何演进,Vue 核心的响应式原理和设计理念仍将继续保持其独特的价值。


雾岛听风
12.1k 声望8.6k 粉丝

丰富自己,胜过取悦别人。