返回

剖析 Vue2.x 响应式系统:Observer、Dep、Watcher 与计算属性

前端

Vue2.x 响应式系统概览

Vue.js 的响应式系统是一项核心功能,它允许数据模型中的更改自动反映到视图中。这背后的机制涉及 Observer、Dep 和 Watcher 对象的协同工作。

Observer: 负责跟踪数据对象中的属性,并在属性值发生变化时通知 Dep 对象。

Dep: 收集依赖于特定属性的 Watcher 对象。当属性值发生变化时,Dep 会通知所有依赖的 Watcher。

Watcher: 观察特定数据属性或表达式,并在属性值发生变化时执行回调函数。

Observer 的作用

Observer 对象通过以下步骤实现对数据属性的监控:

  1. 拦截对象属性: Observer 劫持对象的属性访问和设置,并在属性值发生变化时触发通知。
  2. 创建 Dep 实例: 每个被观察的属性都与一个 Dep 实例相关联,该实例存储依赖于该属性的 Watcher 对象。
  3. 通知 Dep: 当属性值发生变化时,Observer 会通知关联的 Dep,告知它属性值已更改。

Dep 的作用

Dep 对象负责管理依赖于特定属性的 Watcher 对象。当属性值发生变化时,Dep 会执行以下操作:

  1. 收集 Watcher: Dep 收集依赖于属性值的 Watcher 对象。
  2. 通知 Watcher: 当属性值发生变化时,Dep 会通知所有依赖的 Watcher,触发它们的回调函数。

Watcher 的作用

Watcher 对象观察特定的数据属性或表达式。当属性值发生变化时,Watcher 会执行以下操作:

  1. 保存依赖关系: Watcher 记录它依赖的数据属性。
  2. 执行回调: 当依赖的属性值发生变化时,Watcher 会触发其回调函数。

computed 计算属性

computed 属性是 Vue.js 中的一种特殊属性,它基于其他响应式属性计算其值。computed 属性的原理如下:

  1. 定义计算函数: computed 属性是一个函数,返回一个基于其他响应式属性计算的值。
  2. 依赖收集: 当 computed 属性被访问时,Vue.js 会收集该属性依赖的其他响应式属性。
  3. 缓存值: 当依赖的属性值发生变化时,computed 属性的值将被重新计算并缓存。
  4. 响应式输出: 计算属性的值是响应式的,这意味着当依赖的属性值发生变化时,它会自动更新。

nextTick 原理

nextTick 是一个 Vue.js 中的异步函数,它会在下一次 DOM 更新循环结束时执行指定的回调函数。其原理如下:

  1. 队列回调: nextTick 将回调函数推入一个队列中。
  2. DOM 更新完成后执行: 当当前 DOM 更新循环完成后,Vue.js 会执行队列中的回调函数。
  3. 更新视图: 回调函数通常用于执行操作,如更新视图或触发状态变化,以响应 DOM 更新。

通过了解 Observer、Dep、Watcher、computed 和 nextTick 的工作原理,开发者可以深入理解 Vue.js 的响应式系统,从而编写更高效、更可靠的 Vue.js 应用程序。