Vue的響應式基礎是通過Object.defineProperty實現的。但是在數組的處理上,Object.defineProperty并不能一下滿足Vue的需求,Vue2.x采用了一種暴力的方法來解決數組響應式的問題——攔截變異方法。Vue會對那些能導致數組長度變化得方法做攔截式監視,當這些方法被調用時(可以是push,pop,shift,unshift,splice,sort,reverse這7個方法),Vue會發現你對數組進行了變更,然后觸發響應式更新。
{{ code }}
但是需要注意,Vue的攔截技術是wrapper(包裝)模式,Vue會將你操作原數組得方法封裝成一個新方法執行,然后再修改原數組。因此我們需要采用一些小技巧來繞過數組變異攔截機制,比如替換數組:
{{ ` Vue.set(vm.list, indexOfItem, newValue) vm.list.splice(indexOfItem, 1, newValue) vm.list[indexOfItem] = newValue ` }}
比如訪問數組得length屬性(Vue觀測length屬性的變化)來增加數組長度:
{{ ` vm.list.length = newLength ` }}