1、vue2的響應式原理?
1.1、前言
Object.defineProperty+依賴追蹤。
在Vue實例化過程中,會遞歸地將每個數(shù)據(jù)對象的屬性轉換為getter/setter,并維護一個依賴收集器(Dep)。每個屬性都有一個關聯(lián)的watcher,當數(shù)據(jù)發(fā)生變化時,watcher會被通知并更新視圖。
Vue 2.x 實現(xiàn)響應式數(shù)據(jù):
<div id="app">
<p>{{ message }}</p>
<button @click="updateMessage">Update Message</button>
</div>
const app = new Vue({
el: '#app',
data: {
message: 'Hello, Vue!'
},
methods: {
updateMessage() {
this.message = 'Hello, World!';
}
}
});
vue實例化時,會將message屬性轉換為 getter/setter,并添加到依賴收集器中。當屬性值變化時,依賴收集器通知相關的watcher更新視圖。
1.2、如何轉為getter/setter
在 Vue2.X 中,可以使用 Object.defineProperty() 將屬性轉換為 getter/setter。這個方法接收三個參數(shù):對象、屬性名稱和一個描述符對象。
示例代碼:
/*
* @Description:
* @Author: muge
* @Date: 2022-10-03 12:01:03
* @LastEditors: muge
* @LastEditTime: 2023-05-20 14:33:35
*/
var obj = {}; // 創(chuàng)建一個空對象
// 定義一個屬性 name,并將其轉換為 getter/setter
Object.defineProperty(obj, "name", {
get: function () {
console.log("獲取 name 屬性");
return this._name;
},
set: function (value) {
console.log("設置 name 屬性為", value);
this._name = value;
},
});
// 使用屬性
obj.name = "muge"; // 調(diào)用 setter
console.log(obj.name); // 調(diào)用 getter,打印 'muge'
我們將 obj 對象的 name 屬性轉換為 getter/setter。當獲取 name 屬性時,get() 方法會被調(diào)用。當設置 name 屬性時,set() 方法會被調(diào)用。
1.3、為什么Vue 2.x只能追蹤對象屬性的變化,無法直接追蹤數(shù)組的變化?
1.3.1、前言
因為數(shù)組的屬性名是數(shù)字,內(nèi)置方法(如 push、pop、splice 等)可以改變數(shù)組長度或元素值等。導致無法對數(shù)組進行有效監(jiān)聽,使得數(shù)組的數(shù)據(jù)變化無法自動觸發(fā)視圖更新。
如 push 方法添加元素,可以改變數(shù)組的長度,但不會觸發(fā)對應下標的 setter 方法文章來源:http://www.zghlxwxcb.cn/news/detail-456892.html
1.3.2、解決
使用Vue 提供的$set、$delete 等數(shù)組方法。文章來源地址http://www.zghlxwxcb.cn/news/detail-456892.html
到了這里,關于202 vue2的響應式原理 通俗易懂!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!