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

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

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

湖上湖 2019-05-14 11:16:17
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 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

这个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
  • yuqilin
    yuqilin
    您好,我其实对vm.$set/Vue.set的set方法中这一行代码有疑问,ob.dep.notify();这ob.dep是执行new Observer时重新new Dep 挂到了this.dep上,也就是说notify中的this.subs = [],也就意味着没有watcher订阅,那么他是怎么触发视图更新的呢?
  • yuqilin
    yuqilin
    vm.$delete/Vue.delete的del方法中最后也有这一行代码,我现在很迷惑,没想清楚什么原因,请您指点
  • 2 回答
  • 0 关注
  • 1131 浏览
慕课专栏
更多

添加回答

举报

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