解決vue無(wú)法偵聽(tīng)數(shù)組及對(duì)象屬性的變化問(wèn)題
一、數(shù)組
1、可以監(jiān)聽(tīng)到的情況
如push、splice、=賦值(array=[1,2,3])
2、無(wú)法監(jiān)聽(tīng)到的情況
使用下標(biāo)修改某個(gè)元素(這種比較常見(jiàn))
array[index] = 1
object.a = 3
直接修改數(shù)組length
array.length = 5
3、解決方案
this.$set(array, index, data) - 這是個(gè)深度的修改,某些情況下可能導(dǎo)致你不希望的結(jié)果,因此最好還是慎用this.dataArr = this.originArrthis.$set(this.dataArr, 0, {data: ’修改第一個(gè)元素’})console.log(this.dataArr) console.log(this.originArr) //同樣的 源數(shù)組也會(huì)被修改 在某些情況下會(huì)導(dǎo)致你不希望的結(jié)果
上面提到的splice方法進(jìn)行增刪改
利用臨時(shí)變量進(jìn)行中轉(zhuǎn)
let tempArr = [...this.targetArr]tempArr[0] = {data: ’test’}this.targetArr = tempArr
二、對(duì)象
對(duì)象和數(shù)組都是js里的引用類(lèi)型,在實(shí)際存儲(chǔ)中,數(shù)據(jù)是存儲(chǔ)在堆中的,利用存儲(chǔ)在棧里的對(duì)象名或者數(shù)組名的指針進(jìn)行索引,因此也存在在淺拷貝和深拷貝以及等號(hào)賦值時(shí),到底是僅僅新建了一個(gè)指針指向了同一份數(shù)據(jù),還是兩個(gè)指針?lè)謩e指向了兩份完全一樣的數(shù)據(jù)的問(wèn)題
1、可以監(jiān)聽(tīng)到的
對(duì)象的直接=賦值
this.obj = {name: ’test’}
2、無(wú)法監(jiān)聽(tīng)到的
對(duì)象屬性的增刪改
obj: { prop1: ’data1’, prop2: ’data2’}...// 增this.obj.prop3 = ’data3’// 刪delete this.obj.prop1// 改this.obj.prop1 = ’data4’
3、解決辦法
this.$set(obj, key ,value) - 可實(shí)現(xiàn)增、改watch時(shí)添加deep:true深度監(jiān)聽(tīng),只能監(jiān)聽(tīng)到屬性值的變化,新增、刪除屬性無(wú)法監(jiān)聽(tīng)this.$watch(’blog’, this.getCatalog, { deep: true // immediate: true // 是否第一次觸發(fā) });watch時(shí)直接監(jiān)聽(tīng)某個(gè)keywatch: { ’obj.name’(curVal, oldVal) { // TODO }}object.assign()+直接=賦值this.watchObj = Object.assign({}, this.watchObj, { name: ’xiaoyue’, age: 15,});
補(bǔ)充知識(shí):vue 監(jiān)聽(tīng)不到數(shù)組或?qū)ο笾档淖兓趺崔k
一、vue監(jiān)聽(tīng)數(shù)組的變化
vue能購(gòu)監(jiān)聽(tīng)到數(shù)組變化的場(chǎng)景
通過(guò)賦值的形式改變正在被監(jiān)聽(tīng)的數(shù)組;
通過(guò)splice(index, num, val) 的形式改變正在被監(jiān)聽(tīng)的數(shù)組;
通過(guò)數(shù)組的push的形式改變正在被監(jiān)聽(tīng)的數(shù)組。
vue無(wú)法監(jiān)聽(tīng)數(shù)組變化的場(chǎng)景
通過(guò)數(shù)組索引改變數(shù)組元素的值;
改變數(shù)組的長(zhǎng)度;
vue無(wú)法監(jiān)聽(tīng)數(shù)組變化的場(chǎng)景
this.$set(arr, index, newVal);
通過(guò)splice(index,num,val);
使用臨時(shí)變量作為中轉(zhuǎn),重新賦值數(shù)組;
二、vue監(jiān)聽(tīng)對(duì)象的變化
vue能夠監(jiān)聽(tīng)到對(duì)象變化的場(chǎng)景
通過(guò)直接賦值的場(chǎng)景。
eg:watchObj = {name:“zyk”}
vue無(wú)法監(jiān)聽(tīng)到對(duì)象變化的場(chǎng)景
對(duì)象的增加、刪除、修改無(wú)法被vue監(jiān)聽(tīng)到
vue解決無(wú)法監(jiān)聽(tīng)對(duì)象變化的方法
使用 this.$set(object, key, value)(vue 無(wú)法監(jiān)聽(tīng) this.set 修改原有屬性)
使用Object.assign(),直接賦值的原理;(推薦使用)
以上這篇解決vue無(wú)法偵聽(tīng)數(shù)組及對(duì)象屬性的變化問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. IntelliJ IDEA配置Tomcat服務(wù)器的方法2. docker /var/lib/docker/aufs/mnt 目錄清理方法3. Docker容器如何更新打包并上傳到阿里云4. IntelliJ IDEA導(dǎo)入項(xiàng)目的方法5. Docker 部署 Prometheus的安裝詳細(xì)教程6. idea修改背景顏色樣式的方法7. 一篇文章弄清楚Ajax請(qǐng)求的五個(gè)步驟8. el-table表格動(dòng)態(tài)合并相同數(shù)據(jù)單元格(可指定列+自定義合并)9. 關(guān)于CSS渲染:CSS是如何繪制顏色的10. Visual Studio 2022 MAUI NU1105(NETSDK1005) 問(wèn)題處理記錄
