为了账号安全,请及时绑定邮箱和手机立即绑定

vuejs源码关于observer部分的dep有什么作用

vuejs源码关于observer部分的dep有什么作用

幕布斯7119047 2019-05-14 09:53:05
observer类:constructor(value:any){this.value=valuethis.dep=newDep()this.vmCount=0def(value,'__ob__',this)if(Array.isArray(value)){constaugment=hasProto?protoAugment:copyAugmentaugment(value,arrayMethods,arrayKeys)this.observeArray(value)}else{this.walk(value)}}这里的dep属性有什么作用呢?我知道defineReactive方法会改造gettersetter方法来收集依赖和通知watcher,但是这个方法里都是用的闭包里的dep来操作的,为什么还要在observer里面声明一个dep实例呢?
查看完整描述

2 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

这个dep属性是在Vue.$set和$delete中用到的。如$set中倒数第二行代码
exportfunctionset(target:Array|Object,key:any,val:any):any{
if(process.env.NODE_ENV!=='production'&&
(isUndef(target)||isPrimitive(target))
){
warn(`Cannotsetreactivepropertyonundefined,null,orprimitivevalue:${(target:any)}`)
}
if(Array.isArray(target)&&isValidArrayIndex(key)){
target.length=Math.max(target.length,key)
target.splice(key,1,val)
returnval
}
if(keyintarget&&!(keyinObject.prototype)){
target[key]=val
returnval
}
constob=(target:any).__ob__
if(target._isVue||(ob&&ob.vmCount)){
process.env.NODE_ENV!=='production'&&warn(
'AvoidaddingreactivepropertiestoaVueinstanceoritsroot$data'+
'atruntime-declareitupfrontinthedataoption.'
)
returnval
}
if(!ob){
target[key]=val
returnval
}
defineReactive(ob.value,key,val)
ob.dep.notify()//这里的dep指的就是楼主所问的dep属性
returnval
}
                            
查看完整回答
反对 回复 2019-05-14
  • 2 回答
  • 0 关注
  • 1104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信