vue數(shù)據(jù)雙向綁定原理解析(get & set)
前端的數(shù)據(jù)雙向綁定指的是view(視圖)和model(數(shù)據(jù))兩者之間的關(guān)系;view層是頁(yè)面上展示給用戶看的信息,model層一般是指通過http請(qǐng)求從后臺(tái)返回的數(shù)據(jù)。view到model的綁定都是通過事件回調(diào)函數(shù)操作的,model到view的綁定有多種方法。
angular,react,vue等mv*模式的框架都實(shí)現(xiàn)了數(shù)據(jù)雙向綁定;angular是通過臟檢查即新老數(shù)據(jù)的比較來確定哪些數(shù)據(jù)發(fā)生了變化,從而將它更新到view中;vue則是通過設(shè)置數(shù)據(jù)的get和set函數(shù)來實(shí)現(xiàn)的,這種方式在性能上是優(yōu)于angular的。
下面代碼是一個(gè)簡(jiǎn)單的定義數(shù)據(jù)get和set方法的例子,set和get方法分別在數(shù)據(jù)改變和訪問的時(shí)候被調(diào)用,能夠監(jiān)聽數(shù)據(jù)的變化:
// 數(shù)據(jù)綁定的構(gòu)造函數(shù)
function Observer(data) {
this.data = data;
for(var key in data) {
if(data.hasOwnProperty(key)) {
var val = data[key];
if(typeof data[key] === "object"){
// 如果值不為原始類型,則繼續(xù)遞歸
new Observer(val);
}else {
this.convert(key, val);
}
}
}
}
// 定義set 和 get函數(shù)
Observer.prototype.convert = function(key, val) {
Object.defineProperty(this.data, key, {
enumerable: true,
confingurable: true,
get: function() {
console.log(key + "被訪問了");
return val;
},
set: function(newVal) {
console.log(key + "被設(shè)置了新值" + newVal);
val = newVal;
}
});
}
var app = new Observer({name: "xieshuai", age: 24, address: {city: "shenzheng"}});
app.data.name; // name被訪問了
app.data.age = 18; // age被設(shè)置了新值18
Object.defineProperty,這是ES6新增的方法,通過這個(gè)方法,可以自定義getter和setter函數(shù)。
上面的代碼只是個(gè)簡(jiǎn)單的例子,并沒有處理數(shù)組的情況;不過這是vue實(shí)現(xiàn)數(shù)據(jù)雙向綁定的核心。
本文到此結(jié)束,文中若有不對(duì)之處,還望指正。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
淺談vue-lazyload實(shí)現(xiàn)的詳細(xì)過程
本篇文章主要介紹了淺談vue-lazyload實(shí)現(xiàn)的詳細(xì)過程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
Vue+ElementUI 中級(jí)聯(lián)選擇器Bug問題的解決
這篇文章主要介紹了Vue+ElementUI 中級(jí)聯(lián)選擇器Bug問題的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-07-07
vuejs開發(fā)組件分享之H5圖片上傳、壓縮及拍照旋轉(zhuǎn)的問題處理
這篇文章主要介紹了vuejs開發(fā)組件分享之H5圖片上傳、壓縮及拍照旋轉(zhuǎn)的問題處理,需要的朋友可以參考下2017-03-03
Vue首屏加載過慢出現(xiàn)長(zhǎng)時(shí)間白屏的實(shí)現(xiàn)
本文主要介紹了Vue首屏加載過慢出現(xiàn)長(zhǎng)時(shí)間白屏的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04
Vue實(shí)現(xiàn)動(dòng)態(tài)路由的示例詳解
這篇文章主要為大家詳細(xì)介紹了Vue實(shí)現(xiàn)動(dòng)態(tài)路由的相關(guān)知識(shí),主要涉及到兩個(gè)方面:一是路由的動(dòng)態(tài)添加,二是基于路由的參數(shù)變化來動(dòng)態(tài)渲染組件,下面就跟隨小編一起深入學(xué)習(xí)一下動(dòng)態(tài)路由的實(shí)現(xiàn)吧2024-02-02
vue.js開發(fā)實(shí)現(xiàn)全局調(diào)用的MessageBox組件實(shí)例代碼
最近學(xué)習(xí)了Vue.js,感覺組件這個(gè)地方知識(shí)點(diǎn)挺多的,而且很重要,所以決定記錄下,下面這篇文章主要給大家介紹了關(guān)于利用vue.js開發(fā)實(shí)現(xiàn)全局調(diào)用的MessageBox組件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11

