返回

记录 Computed 源码分析

前端

Computed 源码分析

在 Vue 中,Computed 是一个计算属性,用于根据其他属性的值计算出一个新的属性。它是一个非常强大的特性,可以帮助我们保持代码的整洁和可维护性。

Computed 的实现原理并不复杂,但它涉及到 Vue 内部的一些核心机制,比如响应式系统和依赖收集。为了更好地理解 Computed 的工作原理,我们从源代码的角度进行分析。

Computed 的定义

Computed 属性的定义与普通属性非常相似,只是在属性名之前加上 computed 。例如:

computed: {
  fullName() {
    return this.firstName + ' ' + this.lastName
  }
}

在上面的例子中,我们定义了一个名为 fullName 的 Computed 属性,它的值是 firstNamelastName 的拼接结果。

依赖收集

当一个 Computed 属性被访问时,Vue 会自动收集它所依赖的属性。例如,在上面的例子中,fullName 依赖于 firstNamelastName。当 firstNamelastName 的值发生变化时,fullName 的值也会自动更新。

依赖收集的过程是在 Computed 属性的 getter 函数中完成的。在 getter 函数中,Vue 会使用 Dep.target 来收集当前正在被访问的属性。当一个属性被访问时,Vue 会将 Dep.target 设置为该属性对应的 Dep 实例。这样,当该属性的值发生变化时,Dep 实例就会通知所有依赖于它的 Computed 属性,让它们更新自己的值。

渲染 Watcher

当一个 Computed 属性的值发生变化时,Vue 会创建一个新的渲染 Watcher 来更新视图。渲染 Watcher 会监听 Computed 属性的值,当它的值发生变化时,渲染 Watcher 会重新渲染受影响的组件。

渲染 Watcher 的创建过程是在 computedWatcherOptions 函数中完成的。在 computedWatcherOptions 函数中,Vue 会创建一个新的 Watcher 实例,并将其添加到 renderWatcher 数组中。renderWatcher 数组中的 Watcher 实例会在每次组件更新时被调用,以便更新视图。

缓存

Computed 属性的值会被缓存起来,以便在下次被访问时直接返回缓存的值。这样可以提高 Computed 属性的性能,避免每次都重新计算它的值。

Computed 属性的缓存是在 getter 函数中完成的。在 getter 函数中,Vue 会首先检查 Computed 属性的值是否已经缓存过了。如果已经缓存过了,则直接返回缓存的值。否则,Vue 会计算 Computed 属性的值,并将计算结果缓存起来,以便下次被访问时直接返回。

总结

通过对 Computed 源码的分析,我们了解了 Computed 的工作原理。Computed 是一个非常强大的特性,可以帮助我们保持代码的整洁和可维护性。

在使用 Computed 时,我们需要特别注意以下几点:

  • Computed 属性只能依赖于其他属性,不能依赖于方法。
  • Computed 属性的值是惰性计算的,只有在被访问时才会计算。
  • Computed 属性的值会被缓存起来,以便在下次被访问时直接返回缓存的值。
  • Computed 属性的值可以被修改,但修改后的值不会被缓存。

掌握了 Computed 的工作原理,我们就可以更好地利用它来优化 Vue 组件的性能和可维护性。