2 回答

TA貢獻(xiàn)1828條經(jīng)驗 獲得超6個贊
文檔中提到了這幾點:
由于 JavaScript 的限制,Vue 不能檢測以下變動的數(shù)組:
當(dāng)你利用索引直接設(shè)置一個項時,例如:vm.items[indexOfItem] = newValue
當(dāng)你修改數(shù)組的長度時,例如:vm.items.length = newLength
其中你的疑問是第一點吧?文檔的意思是比如現(xiàn)在有一個數(shù)組arr
,內(nèi)容是[1,2,3]
,然后你想要加多一項,然后arr[3] = 4
,這個時候Vue
是檢測不到的,而且arr[0] = 666
也不行。數(shù)組內(nèi)的對象的內(nèi)容只要一開始添加了,就可以直接arr[index].key = val
這樣改,如果是一開始沒有添加,那就要用$set
添加。至于你說的可以監(jiān)聽到,可以發(fā)一個demo看一下

TA貢獻(xiàn)1824條經(jīng)驗 獲得超8個贊
vue是沒有監(jiān)聽下標(biāo)賦值的操作也無法監(jiān)聽
下面這種是無法監(jiān)聽的
var arr = ["a","b"];
arr[1] = "bbbb";
vue只監(jiān)聽了'push','pop','shift','unshift','splice','sort','reverse'等直接改變原數(shù)組的方法
而$set,內(nèi)部還是splice方法
function set(target, key, val) {
if (Array.isArray(target) && typeof key === 'number') {
target.length = Math.max(target.length, key);
target.splice(key, 1, val);
return val
}
//其他操作
...
}
但是如果你的結(jié)構(gòu)下面:
var arr = ["a",{text:"b"}];
arr[1].text = "bbbbb";
因為對數(shù)據(jù)進(jìn)行了遞歸 對象的賦值是可以直接監(jiān)聽到的
但是下面又不行了
var arr = ["a",{text:"b"}];
arr[1] = {text:"bbbbb"};
總結(jié)來說不要數(shù)組下標(biāo)直接賦值
var arr = ["a",{text:"b"}];
this.arr[1] = {text:"bbbbb"};//除了這種以下都可以
this.arr[1].text = "bbbbb";//利用對象的監(jiān)聽
this.arr = ["a",{text:"bbbbb"}];//同上
this.arr.splice(1, 1, {text:"bbbbb"});//數(shù)組的監(jiān)聽
this.$set(this.arr,1,{text:"bbbbb"});//同上
添加回答
舉報