前言
在 Vue 2(Options API)中,this.$set
是用來在響應式系統中正確新增或修改物件屬性的方法。這對於動態新增屬性或修改陣列的指定索引值特別有用。
語法
this.$set(target, propertyName/index, value) |
target
:要修改的對象或陣列propertyName
(物件)或index
(陣列)value
:要設的值
為什麼需要 this.$set
?
Vue 2 的 reactivity(響應式系統)使用 Object.defineProperty
,它無法偵測到新加的屬性或是直接對陣列用索引來賦值。
例如,下面的程式碼是不會觸發畫面更新的:
this.someObj.newKey = 'value' // 不會觸發更新 |
必須改成:
this.$set(this.someObj, 'newKey', 'value') // 會觸發更新 |
範例一:對物件新增屬性
data() { |
這樣才能讓 user.age
成為響應式屬性,更新時畫面才會重新渲染。
範例二:修改陣列中的值
data() { |
Vue 3 呢?
在 Vue 3 裡,因為 reactivity 系統改用 Proxy,所以可以直接新增或修改屬性,不需要 this.$set
了:
this.someObj.newKey = 'value' // Vue 3 沒問題 |
如果你正在寫 Vue 2 的 Tic Tac Toe 遊戲,當你要動態更新棋盤的某個格子時,這樣做就是對的:
this.$set(this.board[row], col, 'X'); |
這樣才能確保畫面能即時更新。