最近在用 element-ui 開發一個網站,使用 table 組件時,發現修改完數據,有時候會延遲一兩秒,頁面纔會發生變化。
看了一下代碼,發現修改數據的代碼是這樣的html
// popupData是修改的數據,修改完後,賦值給對應的表格數據 this.tableData[this.currentRow] = this.popupData
因爲 JavaScript 的限制,Vue 不能檢測如下數組的變更:vue
vm.items[indexOfItem] = newValue
vm.items.length = newLength
舉個例子:git
var vm = new Vue({ data: { items: ['a', 'b', 'c'] } }) vm.items[1] = 'x' // 不是響應性的 vm.items.length = 2 // 不是響應性的
爲了解決第一類問題,如下兩種方式均可以實現和 vm.items[indexOfItem] = newValue
相同的效果,同時也將在響應式系統內觸發狀態更新:github
// Vue.set Vue.set(vm.items, indexOfItem, newValue)
// Array.prototype.splice vm.items.splice(indexOfItem, 1, newValue)
你也可使用 vm.$set
實例方法,該方法是全局方法 Vue.set
的一個別名:element-ui
vm.$set(vm.items, indexOfItem, newValue)
爲了解決第二類問題,你可使用 splice
:數組
vm.items.splice(newLength)
因此,解決方法就是用 Vue.set
來代替直接賦值ide
this.$set(this.tableData, this.currentRow, this.popupData)