先溫習下object.defineproperty
var obj ={};function
definereactive(obj,key,val)
});}definereactive(obj,'a',0);
console.log("obj",obj);
obj.a = 10;
console.log("obj.a",obj.a); //
0,定義無效,貌似只能賦值一次
definereactive(obj,'a',8);
console.log("obj.a",obj.a); //
cannot redefine property: a
**:
var obj ={};var dep = null
;function
definereactive(obj,key,val)
console.log("valx is:",val);
return
val;
},set:
function
(newval)
});}//
obj.b唯讀
function
definecomputed(obj,key,func);
value = func(); //
執行了 this.a-->get-->列印val = 0;
dep = null
;
"dep isx:",dep);
//大量閉包,直接給b賦值沒有效果,只能讀取obj.b了。
object.defineproperty(obj,key,
});}definereactive(obj,'a',0);
definecomputed(obj,'b',function
());
console.log(obj.b);
"obj.a=",obj.a);
console.log("obj.a=",obj.a);
obj.a +=1; //
obj.a = obj.a + 1;
console.log(obj.b);
obj.a +=1;
console.log(obj.b);
obj.a +=1;
console.log(obj.b);
很繞,難點是下面**會執行兩次a的get函式。第二次在set函式中的執行value = func(); func函式有this.a中執行了get。並+1賦值給閉包變數value。set函式結束之後。obj.a + 1;而
obj.a +=1; //obj.a = obj.a + 1;
vue對computer中的屬性處理分兩步,
先處理為vm._computedwatchers物件,每個key對應乙個watch例項。watch在初始的時候執行。
if (this.computed) else
後是給key都賦值vm中,並且vm.key也進行資料劫持:
object.defineproperty(target, key, sharedpropertydefinition)= shouldcache
//? createcomputedgetter(key)
//: userdef
= noop
createcomputergetter(key) 是關鍵:它和上面的原理類似。接下來mount,
updatecomponent = () =>
_render()執行:vnode = render.call(vm._renderproxy, vm.$createelement) 得到乙個vnode。render是在vue.prototype.$mount 解析模板形成的ast。
_update會到vnode對映到dom節點中去,
原理 vue雙向資料繫結原理以及計算屬性
手寫乙個vue雙向資料繫結以及計算屬性 雙向資料繫結是以object.defineproperty obj,a 1 屬性為核心,整體看的時候比較懵。我在下面進行了顏色以及序號分組,如果原生js不是很好的話,要多看幾遍,下面 進行了大量的注釋,盡可能的方便理解。一 演示 二 演示 a的值 p b的值 ...
vue 計算屬性
在這裡我覺得講 computed 和methods放在一起討論 更 便於 理解。computed var vm new vue computed methods methods methods和computed從顯示效果是一樣的,但是主要的區別是 1.computer 是存在快取的,在data沒有改...
Vue 計算屬性
計算屬性在處理一些複雜邏輯時是很有用的。模板是為了描述檢視的結構。在模板中放入太多的邏輯會讓模板過重且難以維護。這就是為什麼 vue.js 將繫結表示式限制為乙個表示式。如果需要多於乙個表示式的邏輯,應當使用計算屬性 computed。例項1 反轉字串 例項1中模板複雜,不好理解,現在我們採用計算屬...