Vue3 中 refreactive 完整教程


一、核心概念与基本用法

  1. ref 的作用与实现

    • 用途:创建响应式数据,适用于基本类型(如 numberstringboolean)或需要保持引用的对象/数组。
    • 实现原理:通过 Object.defineProperty 包装基本类型,或借助 reactiveProxy 处理对象。
    • 示例
      import { ref } from 'vue';
      const count = ref(0); // 基本类型
      const user = ref({ name: 'Alice' }); // 对象类型
      console.log(count.value); // 访问值需用 .value
      user.value.name = 'Bob'; // 修改对象属性
      
  2. 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 操作) 更高(单次代理)
适用场景 简单值、独立状态 复杂对象、深层嵌套数据

三、应用场景与实例

  1. ref 的典型场景

    • 计数器
      const count = ref(0);
      const increment = () => count.value++;
      
    • 表单开关
      const isModalOpen = ref(false);
      
  2. reactive 的典型场景

    • 用户信息管理
      const user = reactive({
        name: 'Alice',
        address: { city: 'Beijing' }
      });
      
    • 复杂表单状态
      const formState = reactive({
        fields: [{ label: '用户名', value: '' }],
        isValid: false
      });
      
  3. 联合使用示例

    import { ref, reactive, toRefs } from 'vue';
    const globalCount = ref(0); // 独立计数器
    const userProfile = reactive({ // 复杂用户数据
      name: 'Alice',
      preferences: { theme: 'dark' }
    });
    // 解构保持响应性
    const { name, preferences } = toRefs(userProfile);
    

四、进阶技巧

  1. toRefs 解构响应对象

    const state = reactive({ count: 0 });
    const { count } = toRefs(state); // 解构后仍响应
    
  2. 性能优化建议

    • 避免频繁操作 ref.value(如循环中),优先批量更新。
    • 深层 reactive 对象可能影响性能,必要时使用 shallowReactive

五、总结

  • 简单数据用 ref:如计数器、开关状态,需通过 .value 操作。
  • 复杂对象用 reactive:如表单、嵌套数据,直接操作属性更简洁。
  • 混合使用:结合 ref 管理独立状态,reactive 处理复杂逻辑,提升代码可维护性。