Vue2中無(wú)法檢測(cè)到數(shù)組變動(dòng)的原因及解決
由于JavaScript 的限制,Vue 不能檢測(cè)以下數(shù)組的變動(dòng):
- 當(dāng)利用索引直接設(shè)置一個(gè)數(shù)組項(xiàng)時(shí),例如:vm.items[indexOfItem] = newValue
- 當(dāng)修改數(shù)組的長(zhǎ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)性的
解決方法
手動(dòng)添加監(jiān)聽(tīng) // Vue.set Vue.set(vm.items, indexOfItem, newValue) vm.$set(vm.items, indexOfItem, newValue) 使用數(shù)組的變異方法,因?yàn)関ue對(duì)數(shù)組的變異方法實(shí)現(xiàn)了響應(yīng)式 // Array.prototype.splice vm.items.splice(indexOfItem, 1, newValue)
為什么Vue2.0中監(jiān)聽(tīng)不到兩種數(shù)組的變化?
官方文檔中對(duì)于這兩點(diǎn)都是簡(jiǎn)要的概括為“由于JavaScript的限制”無(wú)法實(shí)現(xiàn),而Object.defineProperty是實(shí)現(xiàn)檢測(cè)數(shù)據(jù)改變的方案,那這個(gè)限制是指Object.defineProperty嗎?
其實(shí)原因并不是因?yàn)镺bject.defineProperty()存在漏洞,而是出于性能問(wèn)題的考慮。 Object.defineProperty 在數(shù)組中的表現(xiàn)和在對(duì)象中的表現(xiàn)是一致的,數(shù)組的索引就可以看做是對(duì)象中的 key 。
- 通過(guò)索引訪(fǎng)問(wèn)或設(shè)置對(duì)應(yīng)元素的值時(shí),可以觸發(fā) getter 和 setter 方法
- 通過(guò) push 或 unshift 會(huì)增加索引,對(duì)于新增加的屬性,需要再手動(dòng)初始化才能被 observe 。
- 通過(guò) pop 或 shift 刪除元素,會(huì)刪除并更新索引,也會(huì)觸發(fā) setter 和 getter 方法。
所以, Object.defineProperty 是有監(jiān)控?cái)?shù)組下標(biāo)變化的能力的,只是vue2.x放棄了這個(gè)特性。
源碼分析
Object.property是可以檢測(cè)到通過(guò)索引改變數(shù)組的操作的,而Vue沒(méi)有實(shí)現(xiàn)。那我們看看源碼:
Vue3.0
Vue3.0中則用proxy代替了Object.defineProperty()解決了其存在的問(wèn)題
以上就是Vue2中無(wú)法檢測(cè)到數(shù)組變動(dòng)的原因及解決的詳細(xì)內(nèi)容,更多關(guān)于Vue2 數(shù)組變動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue異步組件與組件懶加載問(wèn)題(import不能導(dǎo)入變量字符串路徑)
這篇文章主要介紹了vue異步組件與組件懶加載問(wèn)題(import不能導(dǎo)入變量字符串路徑),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04vue異步axios獲取的數(shù)據(jù)渲染到頁(yè)面的方法
今天小編就為大家分享一篇vue異步axios獲取的數(shù)據(jù)渲染到頁(yè)面的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08Vue + Scss 動(dòng)態(tài)切換主題顏色實(shí)現(xiàn)換膚的示例代碼
這篇文章主要介紹了Vue + Scss 動(dòng)態(tài)切換主題顏色實(shí)現(xiàn)換膚的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Vue render函數(shù)實(shí)戰(zhàn)之實(shí)現(xiàn)tabs選項(xiàng)卡組件
這篇文章主要介紹了Vue render函數(shù)實(shí)戰(zhàn)之實(shí)現(xiàn)tabs選項(xiàng)卡組件的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-04-04vue3+ts重復(fù)參數(shù)提取成方法多處調(diào)用以及字段無(wú)值時(shí)不傳字段給后端問(wèn)題
在進(jìn)行API開(kāi)發(fā)時(shí),優(yōu)化參數(shù)傳遞是一個(gè)重要的考量,傳統(tǒng)方法中,即使參數(shù)值為空,也會(huì)被包含在請(qǐng)求中發(fā)送給后端,這可能會(huì)導(dǎo)致不必要的數(shù)據(jù)處理,而優(yōu)化后的方法則只會(huì)傳遞那些實(shí)際有值的字段,從而提高數(shù)據(jù)傳輸?shù)挠行院秃蠖颂幚淼男?/div> 2024-10-10在Vue3中為路由Query參數(shù)標(biāo)注類(lèi)型的方法
這篇文章主要介紹了在Vue3中如何為路由Query參數(shù)標(biāo)注類(lèi)型,我們就針對(duì)這個(gè)話(huà)題如何為路由Query參數(shù)標(biāo)注類(lèi)型為例,看看Composable和IOC容器的代碼風(fēng)格究竟有什么不同,需要的朋友可以參考下2024-08-08vue2.0 資源文件assets和static的區(qū)別詳解
這篇文章主要介紹了vue2.0 資源文件assets和static的區(qū)別,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-04-04最新評(píng)論