Vue中 Data 是如何和 Watcher 关联起来的 ?
intiData 方法将 data 代理, 并执行observe(data) 定义依赖属性; 在定义依赖属性中需要判断 Dep.target , 那么和data关联的 Watcher 是什么时候赋值给 Dep.target的 ?
回答:
首先运行initData,代理data,就是监听data中的数据(此时有一个内部的dep,用于后面收集依赖),获取数据的时候运行getter,设置数据的时候运行setter。
Watcher有三种,normal-watcher(watch)、computed-watcher(computed)还有render-watcher(_watcher,_render函数),当他们运行的时候会将Dep.target指向他们自身,此时进行响应数据获取的时候,会把他们添加到对应数据的dep中。后面设置数据,运行setter,会轮询dep中的watcher。
运行initComputed,会创建watcher,并运行getter进行值的获取(懒加载的computed后续获取值一样),在getter前会将Dep.target指向这个watcher,getter里面使用到的响应数据都会收集到这个watcher。
运行initWatch也是同理,创建watcher,并运行getter进行值的获取,方便data收集依赖
render-watcher是在组件渲染或更新时,进行_render函数(这就是watcher),内部使用到的响应数据对render进行依赖收集
回答:
Dep和Watcher你爱我我爱你蜜雪冰城甜蜜蜜,defineProperty的时候有一个Dep实例你有没有看到,getter的时候dep.depend,setter的时候dep.notify。仔细研读一下Dep.prototype.depend和Watcher.prototype.addDep。豁然开朗有没有
以上是 Vue中 Data 是如何和 Watcher 关联起来的 ? 的全部内容, 来源链接: utcz.com/p/936493.html