由於 JavaScript 的限制,Vue 不能檢測以下變動:
1. 當你利用索引直接設置數組的一個項時,例如:vm.items[indexOfItem] = newValue
2. 第二類問題:當你修改數組的長度時,例如:vm.items.length = newLength(解決方案:arrList.splice(newLength))
3. Vue 不能檢測對象屬性的添加或刪除:Vue.set() Vue.delete()
數 組
在 created 階段,視圖未渲染時,直接對數組元素 arrList 賦值 data 里面的初值會發生改變;
在 mounted 階段,直接對數組元素 arrList 賦值會導致Vue無法更新View
( 此時在mounted階段,簡單的做法是不要對數組元素賦值,而是對具體元素的屬性進行更新 )
下面具體闡述:
如果像上面這樣,在 mounted 中直接改變原數組中某一個對象,
則頁面渲染如下:我們發現頁面並未重新渲染,data 值的改變未被偵測到。
【解決方案一】:改的是具體的某個屬性,而非整個對象
頁面渲染如下: 對象屬性值的變化被偵測到,頁面渲染發生改變
【解決方案二】:通過 splice() 方法,刪除某個元素后,再添加一個元素,達到“賦值”的效果:
【解決方案三】: 在 created 鈎子中修改整個對象的值
頁面渲染如下: 對象屬性值的變化被偵測到,頁面渲染發生改變
【解決方案四】:在created 或 mounted 中,調用 vm.$set(object, key, newValue) 或 Vue.set(object, key, newValue)
vm.$set
實例方法,它只是全局 Vue.set
的別名
對 象
對於已經創建的實例,Vue 不能動態添加根級別的響應式屬性。
如上圖,app.a 是響應的,app.b 不是響應的。對於已經創建的實例,Vue 不能動態添加根級別的響應式屬性。
但是,可以使用 Vue.set(object, key, value)
方法向 data 中已經定義過的對象添加響應式屬性。
【思考】:如何根實例的 data 添加新的屬性 b:{ age: 6 } ????
可以先看一下 錯誤示范:
結果控制台報錯:
可見就算用了 Vue.set() ,也並不能直接添加新的屬性,這時候我們需要
先給根實例的 data 添加一個空的對象 obj, 然后用 Vue.set() 為 obj 添加新的屬性和具體的值,如下:
頁面渲染結果: 1---------2