vue 如何監聽Array的變化

2021-10-08 14:21:34 字數 1544 閱讀 3977

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 ...