observer.js
- 在初始化数据的时候,创建一个数组专用的dep
- 给每个对象添加一个 ob 属性,主要是用于保存当前实例对象(this)
- 在 array.js 中在数据改变时,触发数组专用dep的notify()派发更新
- 修改 defineReactive 方法
export function defineReactive(data, key, value) {
let childOb = observe(value)
let dep = new Dep()
Object.defineProperty(data, key, {
get() {
if(Dep.target){
dep.depend()
if(childOb){
childOb.dep.depend()
dependArray(value)
}
}
return value;
},
set(newValue) {
console.log("设置属性",newValue)
if (newValue == value) return;
observe(newValue);
value = newValue;
dep.notify()
}
})
}
- 在array.js 添加 dependArray() 收集儿子的依赖
export function dependArray(value) {
for (let i = 0; i < value.length; i++) {
let currentItem = value[i]
currentItem.__ob__&& currentItem.__ob__.dep.depend()
if(Array.isArray(currentItem)){
dependArray(currentItem)
}
}
}
总结
- 数组的依赖收集就是在初始化的时候添加一个 dep(数组专用) 代理,在get中收集到子元素的所有依赖(包含数组)
- dependArray() 为了收集该数组的子元素的依赖,如果子元素也是数组,那就递归收集