vue jsx 雙向繫結 陣列 vue雙向繫結

2021-10-18 19:54:20 字數 3236 閱讀 1165

*主要功能是下面2個

*1、def設定proxy**

*2、observe觀察資料

*/ function initdata (vm) ;

if (!isplainobject(data)) ;

warn(

'data functions should return an object:n' +

'',vm);}

var keys = object.keys(data);

var props = vm.$options.props;

var methods = vm.$options.methods;

var i = keys.length;

while (i--)

}if (props && hasown(props, key)) else if (!isreserved(key))

}// 觀察資料

observe(data, true /* asrootdata */);

}

/**

* 判斷當前資料是否為物件

* 判斷__ob__屬性是否存在,存在則直接引用,不存在則建立observer例項

* 如果是根資料則計數

*/function observe (value, asrootdata)

var ob;

//__ob__:裡面存放了該屬性的觀察器,也就是observer的例項,防止重複繫結。

if (hasown(value, '__ob__') && value.__ob__ instanceof observer) else if (

shouldobserve &&

!isserverrendering() &&

(array.isarray(value) || isplainobject(value)) &&

object.i***tensible(value) &&

!value._isvue

) if (asrootdata && ob)

return ob

}

/**

*將observer例項繫結到目標物件的__ob__屬性

*判斷當前目標物件是否為陣列

*是陣列則監聽陣列的方法,並且為陣列的每個成員嘗試構建乙個observer例項(即呼叫observe函式)

*是物件則響應式物件的屬性

*/var observer = function observer (value) else

this.observearray(value);//對陣列型別的成員進行繫結

} else

};

/**

* 迴圈遍歷進行資料繫結

*/observer.prototype.walk = function walk (obj)

};

/**

* 迴圈遍歷,觀察陣列的每一項

*/observer.prototype.observearray = function observearray (items)

};

/**

* 設定getter、setter

* 建立dep訂閱器

*/function definereactive$$1 (

obj,

key,

val,

customsetter,

shallow

) // cater for pre-defined getter/setters

var getter = property && property.get;

var setter = property && property.set;

if ((!getter || setter) && arguments.length === 2)

// console.log('definereactive$$1===>',dep,dep,dep.target);

var childob = !shallow && observe(val);

object.defineproperty(obj, key, }}

return value

},set: function reactivesetter (newval)

/* eslint-enable no-self-compare */

if (customsetter)

// #7981: for accessor properties without setter

if (getter && !setter)

if (setter) else

childob = !shallow && observe(newval);

// 通知訂閱我這個dep的watcher們:我更新了

dep.notify();

}});

}

/*

*負責編譯template

*1、返回ast語法樹

*2、返回render函式

*3、返回靜態render的陣列

compile編譯流程圖

參考:vue原始碼學習筆記之compile​cassieran.github.io

神仙朱:【vue原理】compile - 白話版​zhuanlan.zhihu.com

vue 雙向繫結資料的原理

vue能做到雙向繫結資料靠的就是object.defineproperty 俗稱屬性 例如 平時我們定義乙個引數 是這樣的 var book console.log book.name 一般的引數 但是你想在輸出的同時對引數進行一些操作 var book var name object.define...

Vue雙向繫結

把乙個普通物件 a 傳給 vue 例項作為它的 data 選項,vue.js 將遍歷它的屬性,用object.defineproperty 將它們轉為 getter setter,如圖綠色的部分所示。每次使用者更改data裡的資料的時候,比如a.b 1,setter就會重新通知watcher進行變動...

Vue 雙向繫結

在react或者vue這類mvvm框架中使用雙向繫結是很常見的需求,最近專案中在使用vue,今天來談一談vue中雙向繫結的實現。先來說幾句廢話 什麼是雙向繫結?把model中的資料繫結到view中,然後更新model時view會自動跟新,這叫單向繫結,而當使用者改變view時model中資料也能自動...