vue數(shù)組中對(duì)象屬性變化頁(yè)面不渲染問(wèn)題

做checkbox多選功能的時(shí)候遇到了一個(gè)坑,邏輯怎么看都對(duì),但是就是有bug,最后發(fā)現(xiàn)數(shù)組那里值變了頁(yè)面勾選沒(méi)有重新渲染。

換了關(guān)鍵詞搜索找到了相關(guān)方法。

其實(shí)之前讀文檔教程的時(shí)候看到過(guò)這里,但是只有真的使用之后才會(huì)有最直接的感觸。


數(shù)組更新檢測(cè)
變異方法
Vue 包含一組觀察數(shù)組的變異方法,所以它們也將會(huì)觸發(fā)視圖更新。這些方法如下:

push()
pop()
shift()
unshift()
splice()
sort()
reverse()
你打開(kāi)控制臺(tái),然后用前面例子的 items 數(shù)組調(diào)用變異方法:example1.items.push({ message: 'Baz' }) 。

替換數(shù)組
變異方法 (mutation method),顧名思義,會(huì)改變被這些方法調(diào)用的原始數(shù)組。相比之下,也有非變異 (non-mutating method) 方法,例如:filter(), concat() 和 slice() 。這些不會(huì)改變?cè)紨?shù)組,但總是返回一個(gè)新數(shù)組。當(dāng)使用非變異方法時(shí),可以用新數(shù)組替換舊數(shù)組:

example1.items = example1.items.filter(function (item) {
return item.message.match(/Foo/)
})

你可能認(rèn)為這將導(dǎo)致 Vue 丟棄現(xiàn)有 DOM 并重新渲染整個(gè)列表。幸運(yùn)的是,事實(shí)并非如此。Vue 為了使得 DOM 元素得到最大范圍的重用而實(shí)現(xiàn)了一些智能的、啟發(fā)式的方法,所以用一個(gè)含有相同元素的數(shù)組去替換原來(lái)的數(shù)組是非常高效的操作。

注意事項(xiàng)
由于 JavaScript 的限制,Vue 不能檢測(cè)以下變動(dòng)的數(shù)組:

當(dāng)你利用索引直接設(shè)置一個(gè)項(xiàng)時(shí),例如:vm.items[indexOfItem] = newValue
當(dāng)你修改數(shù)組的長(zhǎng)度時(shí),例如:vm.items.length = newLength
為了解決第一類(lèi)問(wèn)題,以下兩種方式都可以實(shí)現(xiàn)和 vm.items[indexOfItem] = newValue 相同的效果,同時(shí)也將觸發(fā)狀態(tài)更新:

// Vue.set
Vue.set(example1.items, indexOfItem, newValue)

// Array.prototype.splice
example1.items.splice(indexOfItem, 1, newValue)

為了解決第二類(lèi)問(wèn)題,你可以使用 splice:

example1.items.splice(newLength)

對(duì)象更改檢測(cè)注意事項(xiàng)
還是由于 JavaScript 的限制,Vue 不能檢測(cè)對(duì)象屬性的添加或刪除:

var vm = new Vue({
data: {
a: 1
}
})
// `vm.a` 現(xiàn)在是響應(yīng)式的
 
vm.b = 2
// `vm.b` 不是響應(yīng)式的

對(duì)于已經(jīng)創(chuàng)建的實(shí)例,Vue 不能動(dòng)態(tài)添加根級(jí)別的響應(yīng)式屬性。但是,可以使用 Vue.set(object, key, value) 方法向嵌套對(duì)象添加響應(yīng)式屬性。例如,對(duì)于:

var vm = new Vue({
data: {
userProfile: {
name: 'Anika'
}
}
})

你可以添加一個(gè)新的 age 屬性到嵌套的 userProfile 對(duì)象:

Vue.set(vm.userProfile, 'age', 27)

你還可以使用 vm.$set 實(shí)例方法,它只是全局 Vue.set 的別名:

this.$set(this.userProfile, 'age', 27)

有時(shí)你可能需要為已有對(duì)象賦予多個(gè)新屬性,比如使用 Object.assign() 或 _.extend()。在這種情況下,你應(yīng)該用兩個(gè)對(duì)象的屬性創(chuàng)建一個(gè)新的對(duì)象。所以,如果你想添加新的響應(yīng)式屬性,不要像這樣:

Object.assign(this.userProfile, {
age: 27,
favoriteColor: 'Vue Green'
})

你應(yīng)該這樣做:

this.userProfile = Object.assign({}, this.userProfile, {
age: 27,
favoriteColor: 'Vue Green'
})

用心寫(xiě)代碼,不辜負(fù)程序員之名。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 由于 JavaScript 的限制,Vue 不能檢測(cè)以下變動(dòng)的數(shù)組: 當(dāng)你利用索引直接設(shè)置一個(gè)項(xiàng)時(shí),例如:vm.i...
    淚滴在琴上閱讀 5,375評(píng)論 0 2
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,174評(píng)論 0 29
  • 主要還是自己看的,所有內(nèi)容來(lái)自官方文檔。 介紹 Vue.js 是什么 Vue (讀音 /vju?/,類(lèi)似于 vie...
    Leonzai閱讀 3,537評(píng)論 0 25
  • 1. Vue 實(shí)例 1.1 創(chuàng)建一個(gè)Vue實(shí)例 一個(gè) Vue 應(yīng)用由一個(gè)通過(guò) new Vue 創(chuàng)建的根 Vue 實(shí)...
    王童孟閱讀 1,090評(píng)論 0 2
  • 1.安裝 可以簡(jiǎn)單地在頁(yè)面引入Vue.js作為獨(dú)立版本,Vue即被注冊(cè)為全局變量,可以在頁(yè)面使用了。 如果希望搭建...
    Awey閱讀 11,296評(píng)論 4 129

友情鏈接更多精彩內(nèi)容