Skip to content

computed 计算值为什么还可以依赖另外一个 computed 计算值?

Posted on:2024年8月10日 at 19:07

在 Vue 中,computed 计算属性可以依赖其他 computed 计算属性,因为 Vue 的响应式系统能够正确地追踪依赖关系。

以下是具体的原理和机制:

响应式系统的依赖追踪

Vue 的响应式系统通过依赖收集和依赖追踪来实现。当一个响应式属性被读取时,Vue 会记录下当前的依赖(即哪个组件或者计算属性正在读取这个值)。当这个属性发生变化时,Vue 会通知这些依赖进行更新。

computed 计算属性的实现

computed 计算属性本质上是具有缓存功能的特殊方法。它们只有在其依赖的响应式属性发生变化时才会重新计算,否则返回缓存的值。

依赖其他计算属性

当一个 computed 计算属性依赖于另一个 computed 计算属性时,Vue 能够正确地追踪这些依赖关系。这是因为:

  1. 依赖收集: 当第一个计算属性被访问时,它的 getter 会被调用,并且 Vue 会记录下这个依赖关系。这个过程包括记录依赖的其他计算属性。

  2. 缓存机制: 如果另一个计算属性的值没有改变,Vue 不会重复计算它,而是直接使用缓存值。这保证了性能优化。

  3. 更新机制: 当基础的响应式属性发生变化时,所有依赖它的计算属性都会被重新计算,并且最终更新到组件的渲染中。

示例

下面是一个具体的例子来说明这个过程:

new Vue({
  data() {
    return {
      a: 1,
      b: 2,
    };
  },
  computed: {
    sum() {
      return this.a + this.b;
    },
    doubleSum() {
      return this.sum * 2;
    },
  },
});

在这个例子中:

  1. 依赖收集

    • doubleSum 被访问时,Vue 会调用其 getter,发现它依赖于 sum
    • 然后 Vue 会访问 sum,记录下 sum 依赖于 ab
  2. 缓存机制

    • 如果 ab 没有改变,再次访问 doubleSum 时,Vue 直接返回缓存的值,不会重复计算 sum
  3. 更新机制

    • 如果 ab 发生改变,Vue 会重新计算 sum,然后更新 doubleSum

总结

Vue 的响应式系统能够正确地追踪 computed 计算属性之间的依赖关系,因为它使用了依赖收集和缓存机制。当基础的响应式属性发生变化时,所有依赖关系都会被重新计算并更新,从而保持应用状态的一致性。

原文转自:https://fe.ecool.fun/topic/b5d40614-89d3-42c7-823a-2102ef8006b1