如果说 watcher 修改了 data 中的属性访问和设置,并将属性添加为依赖,那么毫无疑问,watcher 是知道 data 的,可是作为依赖的 data 是如何知道 watcher 的存在的呢?
如果说 watcher 修改了 data 中的属性访问和设置,并将属性添加为依赖,那么毫无疑问,watcher 是知道 data 的,可是作为依赖的 data 是如何知道 watcher 的存在的呢?
vuejs响应式原理真的是超级难以理解,data 中的每个 key 都会对应一个 dep,dep 里面管理的是 targetFunction 列表,实际上是 renderFunction。当 key set 的时候,调用 dep.notify()
实际上干的事情是执行 target。target 能获得 data[key]
并且 render,那 watcher 呢,设置 target 吗?彻底懵了。
9 回答3.3k 阅读
3 回答915 阅读✓ 已解决
4 回答1.9k 阅读
6 回答952 阅读✓ 已解决
5 回答907 阅读✓ 已解决
5 回答877 阅读✓ 已解决
4 回答636 阅读✓ 已解决
export function defineReactive (
obj: Object,
key: string,
val: any,
customSetter?: ?Function,
shallow?: boolean
) {
const dep = new Dep()
const property = Object.getOwnPropertyDescriptor(obj, key)
if (property && property.configurable === false) {
}
// cater for pre-defined getter/setters
const getter = property && property.get
const setter = property && property.set
if ((!getter || setter) && arguments.length === 2) {
}
let childOb = !shallow && observe(val)
Object.defineProperty(obj, key, {
})
}
observer data,然后通过render函数(下面的代码就是生成的render函数)触发get,收集对应watcher
然后对应data改变时,触发set,执行dep.notify(),取出watcher更新dom.
详细自己断点调试。