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 } )