Vue3中的Ref和Reactive
Vue3 中 ref
与 reactive
完整教程
一、核心概念与基本用法
ref
的作用与实现- 用途:创建响应式数据,适用于基本类型(如
number
、string
、boolean
)或需要保持引用的对象/数组。 - 实现原理:通过
Object.defineProperty
包装基本类型,或借助reactive
的Proxy
处理对象。 - 示例:
import { ref } from 'vue'; const count = ref(0); // 基本类型 const user = ref({ name: 'Alice' }); // 对象类型 console.log(count.value); // 访问值需用 .value user.value.name = 'Bob'; // 修改对象属性
- 用途:创建响应式数据,适用于基本类型(如
reactive
的作用与实现- 用途:创建响应式对象,适用于复杂数据结构(如嵌套对象、数组)。
- 实现原理:基于
Proxy
代理对象,递归监听所有属性变化。 - 示例:
import { reactive } from 'vue'; const state = reactive({ count: 0, profile: { name: 'Alice' } }); state.count++; // 直接修改属性 state.profile.name = 'Bob'; // 深层嵌套仍响应
二、对比表格:ref
vs reactive
特性 | ref |
reactive |
---|---|---|
数据类型 | 基本类型或对象/数组 | 仅对象或数组 |
访问方式 | 需通过 .value 访问 |
直接访问属性 |
解构响应性 | 需手动处理 | 需配合 toRefs 保持响应性 |
实现原理 | 基本类型用 Object.defineProperty |
基于 Proxy 代理 |
性能 | 略低(需额外 .value 操作) |
更高(单次代理) |
适用场景 | 简单值、独立状态 | 复杂对象、深层嵌套数据 |
三、应用场景与实例
ref
的典型场景- 计数器:
const count = ref(0); const increment = () => count.value++;
- 表单开关:
const isModalOpen = ref(false);
- 计数器:
reactive
的典型场景- 用户信息管理:
const user = reactive({ name: 'Alice', address: { city: 'Beijing' } });
- 复杂表单状态:
const formState = reactive({ fields: [{ label: '用户名', value: '' }], isValid: false });
- 用户信息管理:
联合使用示例
import { ref, reactive, toRefs } from 'vue'; const globalCount = ref(0); // 独立计数器 const userProfile = reactive({ // 复杂用户数据 name: 'Alice', preferences: { theme: 'dark' } }); // 解构保持响应性 const { name, preferences } = toRefs(userProfile);
四、进阶技巧
toRefs
解构响应对象const state = reactive({ count: 0 }); const { count } = toRefs(state); // 解构后仍响应
性能优化建议
- 避免频繁操作
ref.value
(如循环中),优先批量更新。 - 深层
reactive
对象可能影响性能,必要时使用shallowReactive
。
- 避免频繁操作
五、总结
- 简单数据用
ref
:如计数器、开关状态,需通过.value
操作。 - 复杂对象用
reactive
:如表单、嵌套数据,直接操作属性更简洁。 - 混合使用:结合
ref
管理独立状态,reactive
处理复杂逻辑,提升代码可维护性。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 万家灯火