熟悉vue的小夥伴應該熟悉vue中的v-model的使用方法,他的作用就是來實心雙資料繫結的,那麼先在來說明一下雙資料繫結的原理
它的底層原理是由object.defineproperty實現的
作用:給乙個物件新增或者修改屬性,返回乙個物件
引數:引數一:目標物件
引數二:需要修改或新增的屬性
引數三:給當前屬性的一些特徵
接下來我們來簡單實現以下
var obj =object.defineproperty(obj,'name',)
console.log(obj)
這樣我們就實現了給物件新增name這個屬性值為val
這樣我們再次學他的其他一些簡單的應用
var obj =object.defineproperty(obj,'name',, //當屬性被獲取時觸發
set(){} //當屬性被修改時觸發
})
當使用set,get方法時候,不能使用value,writable這兩個屬性
原理:我們通過監聽乙個資料的變化,再將資料變化時的值設定另乙個資料上
現在我們依照原理來簡單實現以下
我們這樣就完成了乙個簡單的雙資料繫結
但是我們還沒有看見vue的影子,接下來我們寫乙個稍微複雜一點的雙資料繫結
var otxt = document.getelementbyid('txt')var omsg = document.getelementbyid('msg')
function vue(options)
vue.prototype = }})
})}
}var vm = new vue(
})otxt.addeventlistener('input',function())
這樣看起來會比較像,但是還是感覺差了點什麼
所以我們再寫乙個最終版的vue雙資料繫結}}
}}}}
}}}}
function vue(options);this.init(this.data);
this.eventtype(this.el);
}vue.prototype =
console.log(_this.viewmodel)
object.defineproperty(obj,key,,
set:function(newvalue))}}
})})
},eventtype:function(root)
})(i))
}if(childs[i].innertext.replace(/\\}/g,""))\}/g,"");
_this.viewmodel[dataattr]._directive.push(new watch(
childs[i].tagname,
"innertext",
childs[i],
_this,
dataattr))}
}}
}//更新資料的方法 標籤的名稱 當前元素 當前元素的屬性 vue的例項 data屬性
function watch(name,exp,el,vm,attr)
watch.prototype.update = function()
var vm = new vue(
})
vue實現資料雙向繫結原理
vue實現資料雙向繫結主要是採用資料劫持結合發布者 訂閱者的模式的方式來實現。通過object.defineproperty 的get和set來劫持每個屬性,在資料發生變化時通過發布者發訊息給訂閱者,觸發相應的監聽回掉。具體就是先把說有的資料做乙個資料劫持。第一先修改資料,在input框輸入值的時候...
原理 vue雙向資料繫結原理以及計算屬性
手寫乙個vue雙向資料繫結以及計算屬性 雙向資料繫結是以object.defineproperty obj,a 1 屬性為核心,整體看的時候比較懵。我在下面進行了顏色以及序號分組,如果原生js不是很好的話,要多看幾遍,下面 進行了大量的注釋,盡可能的方便理解。一 演示 二 演示 a的值 p b的值 ...
vue中的資料繫結原理
vue中的響應式資料繫結是通過資料劫持和觀察者模式來實現的。當前學習原始碼為vue2.0 原始碼關鍵目錄 src core instance init.js state.js observer dep.js watcher.js 當我們例項化乙個vue應用的時候,會伴隨著各種的初始化工作,相關的初始...