object.defineproperty對陣列進行響應式化是有缺陷的,雖然我們可以監聽到索引的改變。
function def (obj, key, val) ,
set: function(newval)
val = newval;
console.log("資料改變了");
}});
}var data = [1, 2, 3];
def(data, 0, 2);
我們可以檢視data結構如下:
// 獲取
// 2
data[0] = 100
// 資料改變了
data.length = 0; // 控制台無任何輸出
但是defineproperty不能檢測到陣列長度的變化,準確來說是通過改變length而增加的長度不能檢測到。
vue監聽array三部曲:
第一步:先獲取原生array的原型方法,因為攔截後還是需要原生的方法幫我們實現陣列的變化;
第二步:對array的原型方法使用object.defineproperty做一些攔截操作;
第三步:把需要被攔截的array型別的資料原型指向改造後原型。
在進行資料observer繫結的時候,我們先判斷是否
// 判斷是否有__proto__,因為部分瀏覽器是沒有__proto__屬性
var hasproto = '__proto__' in {};
var arrayproto = array.prototype;
var arraymethods = object.create(arrayproto);
var methods = ['push', 'pop', 'shift', 'unshift', 'reverse', 'sort', 'splice'];
function def (obj, key, val, enumerable) );
}methods.foreach(function(method)
var ob = this.__ob__;
var inserted;
switch(method)
if (inserted)
return result;
});})var arraykeys = object.getownpropertynames(arraymethods);
var observer = function observer (value) else
}}// 原型的賦值
function protoaugment (target, src)
// 賦值
function copyaugment (target, src, keys)
}
參考資料: vue如何監聽陣列變化?
vue.js觀察陣列變化主要通過以下7個方法 push pop shift unshift splice sort reverse 怎麼實現?通過對data資料中陣列的這7個方法進行重新包裝 注意只是data資料中的陣列 為什麼不直接對array.prototype的原型方法進行重新包裝?因為不應該...
vue監聽陣列變化
1 觸發更新檢視 2function updateview 56 重新定義陣列原型 7 const oldarrayproperty array.prototype8 建立新物件,原型指向 oldarrayproperty 再擴充套件新的方法不會影響原型 9 const arrproto objec...
vue監聽屬性變化
1.通過偵聽器watch來偵聽屬性 var vm new vue watch lastname function val 上面 是命令式且重複的,當有一些資料需要隨著其它資料變動而變動時,很容易濫用watch,通常更好的做法是使用計算屬性而不是命令式的watch 2.通過計算屬性來偵聽屬性 var ...