淺談vue中數(shù)據(jù)雙向綁定的實(shí)現(xiàn)原理
vue中最常見的屬v-model這個(gè)數(shù)據(jù)雙向綁定了,很好奇它是如何實(shí)現(xiàn)的呢?嘗試著用原生的JS去實(shí)現(xiàn)一下。
首先大致學(xué)習(xí)了解下Object.defineProperty()這個(gè)東東吧!
* Object.defineProperty()
* 對(duì)對(duì)象的屬性進(jìn)行 定義/修改
* */
let obj = {x:10}
// 這兩種方式都相對(duì)來說比較簡單,直接,但是有些時(shí)候我們需要對(duì)對(duì)象的屬性的修改和增加進(jìn)行必要的干預(yù)
// obj.y = 20;
// obj.x = 100;
// obj.x = 'abc';
//
// let arr = [1,2,3];
// arr.length = 'abc';//不可更改
// console.log(arr);
// console.log(obj.x);
// delete obj.x;
// console.log(obj);
Object.defineProperty(obj, 'y', {
configurable: false, //設(shè)置是否可刪除 false為不可刪除
value: 100
});
console.log(obj);
delete obj.y;//刪除
console.log(obj);
//設(shè)置對(duì)象某個(gè)屬性值的時(shí)候,順便設(shè)置它的屬性。enumerable 可枚舉 configurable 可以刪除否 writable 可改值否
Object.defineProperty(obj, 'z', {//enumerable 可枚舉(沒有則新添加)
enumerable: true,//為false時(shí),for..in object.keys json.stringfy 不能取到該z屬性
value: 10000
});
for (var attr in obj) {
console.log(attr);
}
Object.defineProperty(obj, 'm', {
writable: false,//可更改
value: 9
});
console.log(obj);
obj.m = 100;
console.log(obj);
以上總結(jié)了對(duì)象的defineProperty四個(gè)屬性:configurable,enumerable,value,writable
接下來再深入認(rèn)識(shí)下它的另外兩個(gè)方法:set 以及get
注意:get和set不能與configurable,enumerable,value,writable同時(shí)存在
let obj = {x:10}
let y = 100;
Object.defineProperty(obj, 'y', {
get() {
//當(dāng)obj的y屬性被調(diào)用的時(shí)候觸發(fā),該方法的返回值將作為獲取的結(jié)果
console.log('get');
return y;
},
set(value) {
//當(dāng)obj的y屬性被設(shè)置的時(shí)候觸發(fā)
console.log('set', value);
y = value;
}
})
console.log(obj.y);
obj.y = 1;
console.log(obj.y);

介紹完defineProperty了,最后我們一起看看如何簡單的實(shí)現(xiàn)數(shù)據(jù)雙向綁定吧!
<body>
<input type="text" id="age">
<h1></h1>
<script>
var ageElement = document.querySelector('#age');
var h1Element = document.querySelector('h1');
let obj = {};
Object.defineProperty(obj, 'age', {
get() {
},
set(value) {
ageElement.value = value;
h1Element.innerHTML = value;
}
})
obj.age = 10;
ageElement.oninput = function() {
obj.age = this.value;
}
</script>

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
關(guān)于Vue中img動(dòng)態(tài)拼接src圖片地址的問題
這篇文章主要介紹了關(guān)于Vue中img動(dòng)態(tài)拼接src圖片地址的問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-10-10
Vue3實(shí)現(xiàn)動(dòng)態(tài)高度的虛擬滾動(dòng)列表的示例代碼
虛擬滾動(dòng)列表是一種優(yōu)化長列表渲染性能的技術(shù),通過只渲染可視區(qū)域內(nèi)的列表項(xiàng),減少DOM的渲染數(shù)量,本文就來介紹一下Vue3實(shí)現(xiàn)動(dòng)態(tài)高度的虛擬滾動(dòng)列表的示例代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2025-01-01
vue3如何使用postcss-px-to-viewport適配屏幕
這篇文章主要介紹了vue3如何使用postcss-px-to-viewport適配屏幕問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
axios取消請(qǐng)求CancelToken的用法示例代碼
Axios提供了取消請(qǐng)求的功能,可以通過使用CancelToken來實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于axios取消請(qǐng)求CancelToken的用法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10
Vue中使用Element UI的Table組件實(shí)現(xiàn)嵌套表格功能
這篇文章主要介紹了Vue中使用Element UI的Table組件實(shí)現(xiàn)嵌套表格功能,演示如何在Vue中使用Element UI的Table組件實(shí)現(xiàn)嵌套表格,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
vue.js實(shí)現(xiàn)雙擊放大預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了vue.js實(shí)現(xiàn)雙擊放大預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06

