# computed
# 和 watch
差异
computed
是生成一个新的属性挂载到实例上,watch
是监听已经存在且挂载到实例上的数据,所以watch
也可以监听computed
属性变化computed
具有缓存,只有依赖变化才会重新计算computed
适合一个数据被多个数据影响,watch
适合要给数据影响多个数据
# 原理
- 依赖变化,修改脏数据标志为真,但不会立即重新计算,只有在访问计算属性的时候,才会重新计算或读取缓存,有懒计算特性
# 流程
- 响应式的值
count
更新 - 同时通知
computed watcher
和 渲染watcher
更新 computed watcher
把dirty
设置为true
- 视图渲染读取到
computed
的值,由于dirty
所以computed watcher
重新求值。
不缓存:
count
改变,先通知到 计算watcher
更新,设置dirty = true
- 再通知到 渲染
watcher
更新,视图重新渲染的时候去 计算watcher
中读取值,发现dirty
是true
,重新执行用户传入的函数求值。
缓存:
other
改变,直接通知 渲染watcher
更新。- 视图重新渲染的时候去 计算
watcher
中读取值,发现dirty
为false
,直接用缓存值watcher.value
,不执行用户传入的函数求值。