vue不能偵測到的變動 & Vue.set


由於 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM