Skip to content

Computed & watcher

Computed本质上是一个具备缓存的watcher,依赖的属性发生变化时就会更新视图,适用于比较消耗性能或表达式过于复杂的计算场景。

computed传入的其实还是一个函数,这里回想一下watcher的本质,其实就是存储了一个需要在特定时机触发的函数。

Vue内部,每个computed属性也有自己的一个对应的watcher实例,叫做computedWatcher 。与渲染watcher不同的是:

1. 渲染`watcher`只能作为依赖被收集到其它的`deps`里,而`computedWatcher`有自己的`deps`,它可以收集别的`watcher`作为自己的依赖。
2. 惰性求值,初始化时不去运行`getter`

假设渲染函数watcher中有计算属性 number,而number又包含着datanum的运算

流程:

  1. 执行渲染函数watcher,首先会将该渲染函数watcher设置为Dep.target
  2. 在读取到number的时候,会先将Dep.target收集到numberdep里,然后将number对应的computedWatcher设置为Dep.target
  3. number中读取到num时,会触发num劫持的getter,将computedWatcher收集到num对应的dep里。

此时的依赖关系为:numdep里装着computedWatchercomputedWatcher里装着渲染函数watcher

此时,如果更新num的值,会一级一级的向上触发更新。