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() 爲了收集該數組的子元素的依賴,如果子元素也是數組,那就遞歸收集