關於vue無法偵聽陣列及物件屬性的變化的解決方案

2022-08-10 18:18:17 字數 1226 閱讀 2643

參考博文

watch一般是可以監聽變數的變化的,但是對於陣列或者物件在某些特定情況下是無法監聽到的。這種情況其實和雙向繫結的原理有關。vue雙向繫結原理是利用js中的object.defineproperty重定義物件的get和set方法,而同時這種方法存在著缺陷,就是只能監聽到物件內已有的值。詳細可見官方文件

如push、splice、=賦值(array=[1,2,3])

使用下標修改某個元素(這種比較常見)

array[index] = 1object.a = 3

直接修改陣列length

array.length = 5

this.dataarr = this

.originarr

this.$set(this.dataarr, 0, )

console.log(

this

.dataarr)

console.log(

this.originarr) //

同樣的 源陣列也會被修改 在某些情況下會導致你不希望的結果

let temparr = [...this

.targetarr]

temparr[0] =

this.targetarr = temparr

物件和陣列都是js裡的引用型別,在實際儲存中,資料是儲存在堆中的,利用儲存在棧裡的物件名或者陣列名的指標進行索引,因此也存在在淺拷貝和深拷貝以及等號賦值時,到底是僅僅新建了乙個指標指向了同乙份資料,還是兩個指標分別指向了兩份完全一樣的資料的問題

這部分內容參考

物件的直接=賦值

this.obj =

物件屬性的增刪改

obj: 

...//

增this.obj.prop3 = 'data3'//刪

delete

this

.obj.prop1//改

this.obj.prop1 = 'data4'

this.$watch('blog', this

.getcatalog, );

watch: 

}

this.watchobj = object.assign({}, this

.watchobj, );

VUE 解決無法監聽陣列 物件的變化

1 vue能夠監聽陣列變化的場景 通過賦值的形式改變正在被監聽的陣列 通過splice index,num,val 的形式改變正在被監聽的陣列 通過陣列的push的形式改變正在被監聽的陣列 2 vue無法監聽的陣列變化的場景 通過陣列索引改變陣列元素的值 改變陣列的長度 3 vue解決無法監聽陣列變...

關於vue框架的v model無法繫結陣列的問題

做vue專案時碰到乙個問題,先來看看 這裡本來外嵌乙個table,然後column是v for迴圈下面的template,為了簡潔其他 就省略了 與 對應的部分資料集,row item.row就是下面的資料物件 然後發現無法繫結,後來發現將陣列裡的index column更改為乙個固定的數值0,則會...

VUE關於物件動態新增屬性無法雙向繫結問題

在專案中遇到的問題,因為物件屬性不固定,需要到資料庫中讀取,然後動態的給物件新增屬性,在新增屬性的過程中發現新增的屬性在雙向繫結時不能生效,房頂方法有三種,如下圖 上邊有三種給物件新增屬性並賦值的方法,只有第一種可以實現值的雙向繫結,但是跟需求不符合,需要新增的屬性不是固定的,後來採用的方法是建立乙...