有兩種情況變動的數組,是VUE不能檢測到的,也不會觸發視圖的更新。
- 通過索引直接設置項
- 修改數組的長度
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src = "https://unpkg.com/vue"></script>
</head>
<body>
<div id="app">
<h2>數組更新</h2>
<ul>
<li v-for="(item, index) in items" :key="index">{{item.name}}</li>
</ul>
<button @click="btnClick">通過索引直接設置項</button>
</div>
<script>
var app = new Vue({
el: '#app',
data: {
items: [
{name: 'qqqqqqqqqq'},
{name: 'wwwwwwwwww'},
{name: 'eeeeeeeeee'}
]
},
methods: {
btnClick() {
// this.items[0] = {name: '改變數組第一個值'}
this.items.push({name: '11111111111111111111111'})
}
}
})
</script>
</body>
</html>
這里,我想說的是第30行,注釋那行,我正在驗證數組變異的方法,所以30行和31行同時寫上的,居然可以利用數組索引直接設置項,然后我就why?教程里說好的不能這樣做的。。。
后面注釋了第31行,才沒有設置成功的。這里,使用push()方法,改變數組也會觸發視圖更新,所以才導致了this.items[0] = {name: '改變數組第一個值'}這么做也能成功。
以上,說明了我自己挖的這個坑的原因,那么,該怎么解決vue不能檢測到通過索引直接設置項的問題呢,如下:
第一種方法:
btnClick() {
this.$set(this.items, 0, {
name: '通過this.$set去改變值'
}
}
第二種方法:
btnClick() {
this.items.splice(0, 1, {
name: '通過splice去改變值'
}
}
第三種方法:
btnClick() {
this.items[0].name = '改變數組第一個值'
}
那么,文章開頭說的vue不能檢測到修改數組長度,辦法呢是用第二種中的splice()來解決。
