计算属性和watch 的疑问

来源:5-5 计算属性 VS 侦听属性(5)

慕粉4283821

2020-12-27

老师我有两个疑问:

  1. 计算属性 和 watch 属性的 对象 是什么时候变成响应式对象的?
  2. 开发中发现计算属性get中只能同步进行,而watch 中支持异步, 从源码角度 怎么来理解呢
写回答

4回答

ustbhuangyi

2020-12-30

//img.mukewang.com/szimg/5fec4c4309946cce19001194.jpg

这里,如果是在模板中访问计算属性 b,触发了它的 Getter,在 evaluate 执行完毕后,这个时候 Dep.target 是 render watcher,那么再执行 watcher.depend,就相当于把计算属性的依赖 a 收集到这个 render watcher 中了,这样 a 变了,除了触发计算属性 watcher 的 update 设置 dirty 为 true,还会触发 render watcher 重新计算,进而触发组件重新渲染,然后模板中再次访问 b,这个时候 dirty 为 true,又重新求值了。

0
3
慕粉4283821
回复
ustbhuangyi
嗯嗯,这下清楚了,感谢老师!!
2020-12-31
共3条回复

慕粉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 收集的, 一直没看到这里

0
0

ustbhuangyi

2020-12-28

1. 计算属性和 watch 属性的初始化过程都是发生在 initState 的过程中
//img1.sycdn.imooc.com/szimg/5fe939880984db5419041150.jpg

它们内部都是通过 watcher 实现的,而在 watcher 中访问数据,该 watcher 就会被当做依赖收集起来,因为在 watcher 计算的时候,会执行 pushTarget,修改 Dep.target。

2. 计算属性和 watch 和异步都无关系,你所说的 watch 中支持异步,是指在 watch 的回调函数执行异步逻辑吧,这个和源码实现本身无关。

0
1
慕粉4283821
老师,这里还是有点疑问,回复里面不方便写代码, 写在回答下面了,麻烦老师看下
2020-12-30
共1条回复

慕粉4283821

提问者

2020-12-27

关于第二点, 是不是因为 计算属性的get 是当成 watcher 的getter 去调用的,如果存在异步的话, 计算得到的value 会是个promise,而 watch 中的方法 是当成回调去执行的,不会影响对user watcher 的求值

0
0

Vue.js 源码深入解析 深入理解Vue实现原理

全方位讲解 Vue.js 源码,进阶高级工程师

4984 学习 · 1037 问题

查看课程