computed: 數組
show me the code緩存
computed : {函數
foo() { if(this.a>0){ return this.a} else { return this.b + this.c } }
}
data() {this
a: 1, b: 1, c: 1,
}
計算屬性會緩存上一次的計算結果,強調:是上一次而不是全部歷史;
每次調用this.foo,是返回上一次的結果仍是執行foo函數返回最新的結果?
是靠computed的響應式構造器內部的變量dirty控制,dirty爲true就執行foo,返回最新的結果,不然就返回緩存的值,而且每次執行foo之後,都會把dirty還原爲false
也就是說 dirty 控制了是否從緩存裏讀取值,那麼何時dirty會被修改成true呢?
deps有修改或者新增(方便記憶,並非新增會觸發,而是新增時也會同步的觸發dirty的修改)的時候;
computed的響應式構造器內部除了有dirty還有一個deps的數組,數組項是foo這個計算屬性的依賴項,注意了,這個依賴不是代碼表面上的this.a,this.b,this.c,而是在執行foo函數時,只有觸發了某個值的getter,纔會被添加到依賴數組,
deps默認爲[],當第一次執行foo函數時,碰到if(this.a),觸發了this.a的getters,就把this.a添加到deps,這時,依賴性裏只有this.a,而且同步修改dirty爲true,繼續執行foo函數,返回最新的結果code
僞代碼表示就是
假設此時deps裏只有this.aget
執行this.b='2'
if(!deps.includes('this.b')){
return 上一次的值
}
執行this.a=2,
返回最新的值,同步
若是剛開始時 this.a=-1,依賴數組裏有a,b,c,這個時候this.a=-2,新值和舊值同樣,那麼會返回上一次的值呢仍是會從新計算? 若是返回上一次的值(foo中的console沒有執行),就說明這個理論有問題,console