Appearance
Computed & watcher
Computed
本质上是一个具备缓存的watcher
,依赖的属性发生变化时就会更新视图,适用于比较消耗性能或表达式过于复杂的计算场景。
computed
传入的其实还是一个函数,这里回想一下watcher
的本质,其实就是存储了一个需要在特定时机触发的函数。
在Vue
内部,每个computed
属性也有自己的一个对应的watcher
实例,叫做computedWatcher
。与渲染watcher
不同的是:
1. 渲染`watcher`只能作为依赖被收集到其它的`deps`里,而`computedWatcher`有自己的`deps`,它可以收集别的`watcher`作为自己的依赖。
2. 惰性求值,初始化时不去运行`getter`
假设渲染函数watcher
中有计算属性 number
,而number
又包含着data
中num
的运算
流程:
- 执行渲染函数
watcher
,首先会将该渲染函数watcher
设置为Dep.target
。 - 在读取到
number
的时候,会先将Dep.target
收集到number
的dep
里,然后将number
对应的computedWatcher
设置为Dep.target
。 - 在
number
中读取到num
时,会触发num
劫持的getter
,将computedWatcher
收集到num
对应的dep里。
此时的依赖关系为:num
的dep
里装着computedWatcher
,computedWatcher
里装着渲染函数watcher
此时,如果更新num的值,会一级一级的向上触发更新。