这段时间学习响应式原理的一点总结,希望老师可以指点
来源:4-1 深入响应式原理

ominus3
2020-05-06
vue 中所有的数据实际上都来源于 data,但是 defineReactive 在 prop、data、computed上都执行过。
data 需要进行响应式处理并标记为“数据源”,因此用的是 observe 函数,打上 __ob__,并递归响应式处理。
对于 prop,prop 都来源于父组件的 data,子组件对于 prop 相当于做了一层浅拷贝,并在子组件做一层响应式监听,并不递归处理。对于 prop 值为对象的情况,由于浅拷贝,实际引用的还是父组件的 data,已经响应式处理过了,在子组件中访问值为对象的 prop 时,会触发父组件 data 的依赖,因此需要 toggleObserve(false)跳过。
对于 computed,兼并了 watcher 和 响应式数据的特点,它像 watcher 可以消耗data,但是又像数据可以拥有自己的 dep,computed 工作时,依赖关系的流向是
renderWatcher -> computed Watcher -> data
不过这里也有一个问题,为什么不可以直接让 renderWatcher 依赖 data 呢,也就是在 computedWatcher 求值的时候不做 pushTarget,不往 Dep.target 推栈,renderWatcher 就可以直接依赖 data了,之所以不这么做是因为会破坏整体设计还是这样每次都会求值造成不必要的消耗?
1回答
-
总结的不错,另外 props 详细的可以看我后面新更新的视频。
另外对于计算属性,计算属性并不总是被 render watcher 所依赖,计算属性也可以依赖计算属性。032020-05-07
相似问题