因爲Js的限制,vue不能監測到數組的變更。vue
Vue 雙向綁定的原理是利用了 Object.defineProperty 重寫了 get / set,以達到當屬性的值發生變化時來更新試圖的;但這有個缺陷,就是若是不是直接修改的屬性,而是調用了變異方法,那麼 Vue 並不知道其值已經發生改變,此時須要手動調用 Vue.set 以通知 Vue。爲了緩解這個問題,Vue 對 Array 的7個方法進行了包裝數組
var arr = [1,2,3]
arr[2] = 6
arr.length = 7
// [1, 2, 6, empty × 4]
複製代碼
Vue 是怎麼知道你把一個對象的值改變之後、就能馬上讓頁面上顯示的結果發生變化呢(所謂的雙向綁定)。它是利用了 Object.defineProperty。spa
但 Object.defineProperty 有缺陷,只能識別出對屬性直接賦值的,即 obj.property = newVal,這種狀況下 Vue 纔會知道有值變化了、該刷新視圖了。雙向綁定
但對變異方法而言,Object.defineProperty 是無效的、沒法得知值在變異方法中變化了。理論上,這種狀況下,應該在代碼中顯示調用 Vue.set 來通知 Vue 有值變化了、該刷新視圖了。code
Vue 爲了緩解這一問題,把 Array 的這幾個變異方法作了包裝,無需 Vue.set,Vue 也能夠知道 Array 的值變化了、該刷新視圖了。cdn
vue 提供了數組的7個變異方法對象