Vue computed 怎么监听其他的 computed 的呢?

知道 computed 监听 data 的属性的原理,但是不太理解 computed 怎么监听其他的 computed 的?感觉 computed 不存在这依赖收集的过程鸭?

我举个例子吧

export default {
  data () {
    return {
      a: 1,
    }
  },
  computed: {
    computedA () {
      return this.a;
    },
    computedB () {
      return this.computedA;
    }
  },
}

computedA 依赖了属性 a,所以当属性 a 发生改变后,会导致 computedAdirty 置为 true,从而使得在读取 computedA 的时候会去重新获取,而不是读取缓存的值。

computedB 依赖了 computedA。但是好像在 computedA 改变后,会去通知 computedB 的 watcher 去更新 dirty 的值吗?

阅读 4.7k
3 个回答

defineProperty能监听set当然也能监听get,就看看运行computed的过程中访问了哪些属性就行了
当然如果你初始化data时没初始化的属性有可能收集不到依赖

Vue 实例在建立的时候会运行一系列的初始化操作,其中数据的初始化包括initProps、initMethods、initData、initComputed、initWatch。

在初始化computed的时候(initComputed),会监测数据是否已经存在data或props上,如果存在则抛出警告,否则调用defineComputed函数对数据进行数据劫持。

如果你computed中的数据a被使用了(调用了getter),那么会设置Dep.target,如果getter中含有被监听了的数据(如b),那么会把Dep.target追加到b的deps中(没有的话),这样当b改变的时候,会遍历计算所有的deps(包括a的getter)。

vue数据初始化--initState

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏