Vue2中無法檢測到數(shù)組變動的原因及解決
由于JavaScript 的限制,Vue 不能檢測以下數(shù)組的變動:
- 當(dāng)利用索引直接設(shè)置一個數(shù)組項(xiàng)時,例如:vm.items[indexOfItem] = newValue
- 當(dāng)修改數(shù)組的長度時,例如:vm.items.length = newLength
var vm = new Vue({
data: {
items: ['a', 'b', 'c']
}
})
vm.items[1] = 'x' // 不是響應(yīng)性的
vm.items.length = 2 // 不是響應(yīng)性的
解決方法
手動添加監(jiān)聽 // Vue.set Vue.set(vm.items, indexOfItem, newValue) vm.$set(vm.items, indexOfItem, newValue) 使用數(shù)組的變異方法,因?yàn)関ue對數(shù)組的變異方法實(shí)現(xiàn)了響應(yīng)式 // Array.prototype.splice vm.items.splice(indexOfItem, 1, newValue)
為什么Vue2.0中監(jiān)聽不到兩種數(shù)組的變化?
官方文檔中對于這兩點(diǎn)都是簡要的概括為“由于JavaScript的限制”無法實(shí)現(xiàn),而Object.defineProperty是實(shí)現(xiàn)檢測數(shù)據(jù)改變的方案,那這個限制是指Object.defineProperty嗎?
其實(shí)原因并不是因?yàn)镺bject.defineProperty()存在漏洞,而是出于性能問題的考慮。 Object.defineProperty 在數(shù)組中的表現(xiàn)和在對象中的表現(xiàn)是一致的,數(shù)組的索引就可以看做是對象中的 key 。
- 通過索引訪問或設(shè)置對應(yīng)元素的值時,可以觸發(fā) getter 和 setter 方法
- 通過 push 或 unshift 會增加索引,對于新增加的屬性,需要再手動初始化才能被 observe 。
- 通過 pop 或 shift 刪除元素,會刪除并更新索引,也會觸發(fā) setter 和 getter 方法。
所以, Object.defineProperty 是有監(jiān)控數(shù)組下標(biāo)變化的能力的,只是vue2.x放棄了這個特性。

源碼分析
Object.property是可以檢測到通過索引改變數(shù)組的操作的,而Vue沒有實(shí)現(xiàn)。那我們看看源碼:

Vue3.0
Vue3.0中則用proxy代替了Object.defineProperty()解決了其存在的問題
以上就是Vue2中無法檢測到數(shù)組變動的原因及解決的詳細(xì)內(nèi)容,更多關(guān)于Vue2 數(shù)組變動的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue+axios實(shí)現(xiàn)登錄攔截的實(shí)例代碼
本篇文章主要介紹了vue+axios實(shí)現(xiàn)登錄攔截的實(shí)例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05
Vue3+TS實(shí)現(xiàn)語音播放組件的示例代碼
這篇文章主要介紹了如何利用Vue+TS實(shí)現(xiàn)一個簡易的語音播放組件,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Vue有一定的幫助,需要的可以參考一下2022-03-03
手寫可拖動穿梭框組件CustormTransfer vue實(shí)現(xiàn)示例
這篇文章主要為大家介紹了手寫可拖動穿梭框組件CustormTransfer vue實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
vue中el-tree?橫向滾動條的實(shí)現(xiàn)
本文詳細(xì)介紹了在Vue框架中使用el-tree組件創(chuàng)建橫向滾動條的方法,通過代碼示例和步驟說明,幫助開發(fā)者理解和實(shí)現(xiàn)橫向滾動功能,感興趣的可以了解一下2024-09-09
vue里的axios如何獲取本地json數(shù)據(jù)
這篇文章主要介紹了vue里的axios如何獲取本地json數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08

