计算属性和watch 的疑问
来源:5-5 计算属性 VS 侦听属性(5)

慕粉4283821
2020-12-27
老师我有两个疑问:
- 计算属性 和 watch 属性的 对象 是什么时候变成响应式对象的?
- 开发中发现计算属性get中只能同步进行,而watch 中支持异步, 从源码角度 怎么来理解呢
4回答
-
这里,如果是在模板中访问计算属性 b,触发了它的 Getter,在 evaluate 执行完毕后,这个时候 Dep.target 是 render watcher,那么再执行 watcher.depend,就相当于把计算属性的依赖 a 收集到这个 render watcher 中了,这样 a 变了,除了触发计算属性 watcher 的 update 设置 dirty 为 true,还会触发 render watcher 重新计算,进而触发组件重新渲染,然后模板中再次访问 b,这个时候 dirty 为 true,又重新求值了。032020-12-31 -
慕粉4283821
提问者
2020-12-30
比如我们在script里面定义了
data: { return { a: 1 }; }, computed: { b() { return this.a + 1 } }
如上述代码,我知道如果 b 在渲染时用到的话,会触发b的get,执行computed watcher 的 evaluate 方法计算,在这个过程中 computed watcher 就会 订阅 依赖 a 。 之后 a 更新也会触发 computed watcher 的重新计算。 。 我想问的 是 里面的属性 b 是什么时候被 当前组件 渲染 watcher 收集的, 一直没看到这里
00 -
ustbhuangyi
2020-12-28
1. 计算属性和 watch 属性的初始化过程都是发生在 initState 的过程中
它们内部都是通过 watcher 实现的,而在 watcher 中访问数据,该 watcher 就会被当做依赖收集起来,因为在 watcher 计算的时候,会执行 pushTarget,修改 Dep.target。
2. 计算属性和 watch 和异步都无关系,你所说的 watch 中支持异步,是指在 watch 的回调函数执行异步逻辑吧,这个和源码实现本身无关。012020-12-30 -
慕粉4283821
提问者
2020-12-27
关于第二点, 是不是因为 计算属性的get 是当成 watcher 的getter 去调用的,如果存在异步的话, 计算得到的value 会是个promise,而 watch 中的方法 是当成回调去执行的,不会影响对user watcher 的求值
00
相似问题