問題:有一個表單是通過數(shù)組循環(huán)出來的,當輸入框的值變化時杨赤,沒有觸發(fā)視圖更新以及觸發(fā)watch敞斋。也就是說改變了數(shù)組里對象里的值沒有觸發(fā)視圖更新
首先,我們要了解Vue是如何實現(xiàn)數(shù)據(jù)的雙向綁定的疾牲!
把一個普通 JavaScript 對象傳給 Vue 實例的 data
選項植捎,Vue 將遍歷此對象所有的屬性,并使用 Object.defineProperty 把這些屬性全部轉(zhuǎn)為 getter/setter阳柔。Object.defineProperty 是僅 ES5 支持鸥跟,且無法 shim 的特性,這也就是為什么 Vue 不支持 IE8 以及更低版本瀏覽器的原因盔沫。
變化檢測問題
受到現(xiàn)代JavaScript瀏覽器的限制医咨,其實主要是 Object.observe() 方法支持的不好,Vue不能檢測到對象的添加或者刪除架诞。然而Vue在初始化實例時就對屬性執(zhí)行了setter/getter轉(zhuǎn)化過程拟淮,所以屬性必須開始就在對象上,這樣才能讓Vue轉(zhuǎn)化它谴忧。
一很泊、數(shù)組
1、可以監(jiān)聽到的情況
如push沾谓、splice委造、=賦值(array=[1,2,3])
2、無法監(jiān)聽到的情況
使用下標修改某個元素(這種比較常見)
//使用下標修改某個元素(這種比較常見)
array[index] = 1
object.a = 3
//直接修改數(shù)組length
array.length = 5
二均驶、對象
1昏兆、可以監(jiān)聽到的
對象的直接=賦值
this.obj = {name: 'test'}
2. 無法監(jiān)聽到的
//對象屬性的增刪改
obj: {
prop1: 'data1',
prop2: 'data2'
}
...
// 增
this.obj.prop3 = 'data3'
// 刪
delete this.obj.prop1
// 改
this.obj.prop1 = 'data4'
解決方法:
1.push到數(shù)組的時候深拷貝一下
JSON.parse(JSON.stringify(this.widget))
2.給this.widget
添加屬性的時候使用$set
添加,將響應屬性添加到對象上
this.$set(this.widget, item.attr,'');
3.object.assign()+直接=賦值