Vue 3 的 reactive 是創建響應式對象的核心 API,但在使用過程中有一些需要注意的事項:
1:基本使用限制
僅對對象類型有效:reactive 只能用于對象類型(Object、Array、Map、Set 等),不能用于原始值(string、number、boolean 等)
const state = reactive ( { count : 0 } )
const count = reactive ( 0 )
2:響應式丟失問題
解構會失去響應性:直接解構 reactive 對象會導致響應性丟失
const state = reactive ( { count : 0 } )
let { count } = state
const { count } = toRefs ( state)
直接賦值會失去響應性:將 reactive 對象整體賦值給另一個變量會失去響應性
const state = reactive ( { count : 0 } )
let copy = state
3:數組和集合類型的注意事項
數組的特殊情況:直接通過索引修改數組元素或修改 length 屬性不會觸發響應
const arr = reactive ( [ 1 , 2 , 3 ] )
arr[ 0 ] = 9
arr. splice ( 0 , 1 , 9 )
Map/Set 的使用:需要使用方法修改而不是直接賦值
const map = reactive ( new Map ( ) )
map. set ( 'key' , 'value' )
map[ 'key' ] = 'value'
4:性能考慮
深層響應式:reactive 是深層的,所有嵌套屬性都是響應式的,對于大型對象可能有性能影響
const obj = reactive ( { nested : { deep : { value : 1 } }
} )
淺層響應式:如果需要淺層響應式,可以使用 shallowReactive
5:其他注意事項
避免重復包裝:不要對已經是 reactive 的對象再次調用 reactive
const state = reactive ( { count : 0 } )
const doubleWrapped = reactive ( state)
與 ref 的互操作:reactive 會自動解包 ref 對象
const count = ref ( 0 )
const state = reactive ( { count } )
console. log ( state. count)
響應式對象替換:替換整個 reactive 對象不會保持響應性
let state = reactive ( { count : 0 } )
state = reactive ( { count : 1 } )
Object. assign ( state, { count : 1 } )