文章目录 ref 和 reactive 一、差异 二、能否替代的场景分析 (1)基本类型数据 (2)对象类型数据 (3)数组类型数据 (4) 需要整体替换的场景 三、替代方案与兼容写法 1. 用 reactive 模拟 ref 2. 用 ref 模拟 reactive 四、最佳实践建议 五、性能对比 六 结论:
ref 和 reactive
一、差异
特性 ref reactive 适用类型 任意类型(包括基本类型) 仅对象/数组 访问对象 需要通过 .value 直接访问属性 整体替换 ✅支持(直接赋值) ❌不支持(需要特殊处理) 解构保持相应性 ❌需要配合 toRef ❌需要配合 toRef 性能开销 较低(仅包装一层) 较高(深度代理)
二、能否替代的场景分析
(1)基本类型数据
const count = ref ( 0 ) ;
const count = reactive ( 0 ) ;
(2)对象类型数据
const objRef = ref ( { a: 1 } ) ;
const objReactive = reactive ( { a: 1 } ) ;
console. log ( objRef. value. a) ;
console. log ( objReactive. a) ;
(3)数组类型数据
const arrRef = ref ( [ 1 , 2 , 3 ] ) ;
const arrReactive = reactive ( [ 1 , 2 , 3 ] ) ;
arrRef. value. push ( 4 ) ;
arrReactive. push ( 4 ) ;
(4) 需要整体替换的场景
const state = ref ( { a: 1 } ) ;
state. value = { a: 2 } ;
const state = reactive ( { a: 1 } ) ;
state = { a: 2 } ;
三、替代方案与兼容写法
1. 用 reactive 模拟 ref
const count = reactive ( { value: 0 } ) ;
console. log ( count. value) ;
2. 用 ref 模拟 reactive
const obj = ref ( { a: 1 } ) ;
console. log ( obj. value. a) ;
四、最佳实践建议
基本类型 → 必须用 ref 对象/数组 → 优先用 reactive(除非需要整体替换) 复杂数据结构 → 混合使用:
const state = reactive ( { count: ref ( 0 ) , user: reactive ( { name: 'Alice' } )
} ) ;
模板中使用 → 优先用 reactive(避免频繁 .value)
五、性能对比
操作 ref reactive 创建响应式对象 ⭐快 ⭐⭐慢 属性访问 ⭐⭐⭐快 ⭐⭐快 数组修改 ⭐⭐中 ⭐⭐⭐快 整体替换 ⭐⭐⭐快 ❌不支持
六 结论:
不能简单用 reactive 完全替代 ref,但可以根据数据类型和使用场景选择:
基本类型 → 必须用 ref对象/数组 → 优先用 reactive需要整体替换 → 必须用 ref模板中直接访问 → 优先用 reactive(减少 .value 噪音)