// vm key handler
new Watcher(vm,exprOrfn,handler,{...options,user:true}
for(let key in computed){
// getters 为computed的handler计算函数
// lazy:true在watcher中区分时computed的属性,执行函数为计算函数
// watcher中用dirty取初始化lazy,默认为true,表示第一次或者需要再次执行handler计算函数,为false读取缓存的值,即watcher的value
_computedWatcher[key] =
new Watcher(vm,getters||handler,()=>{},{lazy:true})
// _render拿到的是虚拟dom解构数据
let updateComponent = ()=>{
vm._update(vm._render())
}
new watcher(vm,updateComponent,()=>{
callHook(vm,'updated') //订阅
},true)
pushTarget(this)
const value = this.getters.call(this.vm,this)
popTarget()
// watcher为当前渲染watcher,dep为每一个definReactive中的私有变量 dep = new Dep()
dep.depend() => Dep.target.addDep(this) => watcher.addDep(dep) =>
watcher.addDep(dep)=>{
// 在watcher中deps添加dep
this.deps.push(dep)
this.depsId.add(id)
//dep中subs也添加当前watcher
dep.addSub(this(watcher))
}
new watcher(vm,updateComponent,()=>{callHook(vm,'updated') },true)
// vm key handler
new Watcher(vm,exprOrfn,handler,{...options,user:true}
new watcher 默认执行get函数,读取一次vm.data的值,调用observe的get,进行依赖收集,defineReactive函数中的私有变量dep再次收集watch监听的watcher。set该变量时,dep.notify会挨个通知执行subs中的watcher
new Watcher(vm,getters||handler,()=>{},{lazy:true})
Q:computed的get方法中:判断if(Dep.target)再进行watcher.depend()互相收集依赖,Dep.target不是每次赋值完就pop吗?Dep中,stack什么情况下length>1?
A:当计算computed的值时,取到vm的变量,触发observe中的getter,此时Dep.target为computed的watcher,再observe中
会将各个变量 fisrtName lastName的dep中push computed-watcher,再computed-watcher的deps中push firstName和
lastName的dep.
在给每个data进行响应式处理时,defineReactive函数里定义私有变量,dep=Dep(),没一个变量都可以找到一个对应的dep
Q: 一个变量对应一个dep,对应一个渲染watcher,可以有多个computed watcher,一个watch watcher, 对不对?
A:一个变量对应一个dep:data中每一个变量进行数据劫持(定义getter)时,定义一个私有变量dep,只能通过变量getter时获取得到
watcher有以下几种
附上本人github的学习仓库 (有大量注释)
p:求求给点个star吧😍
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- nryq.cn 版权所有 赣ICP备2024042798号-6
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务