当前位置: 首页 > news >正文

ref 和 reactive

文章目录

    • ref 和 reactive
      • 一、差异
      • 二、能否替代的场景分析
        • (1)基本类型数据
        • (2)对象类型数据
        • (3)数组类型数据
        • (4) 需要整体替换的场景
      • 三、替代方案与兼容写法
        • 1. 用 reactive 模拟 ref
        • 2. 用 ref 模拟 reactive
      • 四、最佳实践建议
      • 五、性能对比
      • 六 结论:

ref 和 reactive

一、差异

在这里插入图片描述

特性refreactive
适用类型任意类型(包括基本类型)仅对象/数组
访问对象需要通过 .value直接访问属性
整体替换✅支持(直接赋值)❌不支持(需要特殊处理)
解构保持相应性❌需要配合 toRef❌需要配合 toRef
性能开销较低(仅包装一层)较高(深度代理)

二、能否替代的场景分析

(1)基本类型数据
// ✅ 必须用 ref
const count = ref(0); // 正确
const count = reactive(0); // ❌ 错误(reactive 只能处理对象)
(2)对象类型数据
// ✅ 可以用 reactive 替代 ref
const objRef = ref({ a: 1 });
const objReactive = reactive({ a: 1 });// 访问方式差异
console.log(objRef.value.a); // ref 需要 .value
console.log(objReactive.a);  // reactive 直接访问
(3)数组类型数据
// ✅ 可以用 reactive 替代 ref
const arrRef = ref([1, 2, 3]);
const arrReactive = reactive([1, 2, 3]);// 修改操作差异
arrRef.value.push(4);   // ref 需要 .value
arrReactive.push(4);    // reactive 直接操作
(4) 需要整体替换的场景
// ✅ 必须用 ref
const state = ref({ a: 1 });
state.value = { a: 2 }; // ✅ 正确// ❌ reactive 无法直接替换
const state = reactive({ a: 1 });
state = { a: 2 }; // ❌ 错误(失去响应性) 

三、替代方案与兼容写法

1. 用 reactive 模拟 ref
// 通过 reactive 包装单属性对象
const count = reactive({ value: 0 });
console.log(count.value); // 访问方式与 ref 一致
2. 用 ref 模拟 reactive
// 通过 ref 包装对象
const obj = ref({ a: 1 });
console.log(obj.value.a); // 访问时需要 .value

四、最佳实践建议

  1. 基本类型 → 必须用 ref
  2. 对象/数组 → 优先用 reactive(除非需要整体替换)
  3. 复杂数据结构 → 混合使用:
const state = reactive({count: ref(0),       // 嵌套 refuser: reactive({     // 嵌套 reactivename: 'Alice'})
});
  1. 模板中使用 → 优先用 reactive(避免频繁 .value)

五、性能对比

操作refreactive
创建响应式对象⭐快⭐⭐慢
属性访问⭐⭐⭐快⭐⭐快
数组修改⭐⭐中⭐⭐⭐快
整体替换⭐⭐⭐快❌不支持

六 结论:

不能简单用 reactive 完全替代 ref,但可以根据数据类型和使用场景选择:

  • 基本类型 → 必须用 ref
  • 对象/数组 → 优先用 reactive
  • 需要整体替换 → 必须用 ref
  • 模板中直接访问 → 优先用 reactive(减少 .value 噪音)
http://www.lryc.cn/news/586880.html

相关文章:

  • https交互原理
  • [Subtitle Edit] 字幕格式处理 | .Net依赖管理(NuGet)
  • Python----OpenCV(图像分割——彩色图像分割,GrabCut算法分割图像)
  • LeetCode--44.通配符匹配
  • Mybatis 两级缓存可能导致的问题
  • Java4种设计模式详解(单例模式、工厂模式、适配器模式、代理模式)
  • 笔记/sklearn中的数据划分方法
  • 赛力斯6月新能源汽车销量46086辆,同比增长4.44%
  • JavaScript加强篇——第九章 正则表达式高级应用(终)
  • Linux编程:6、进程通信-信号量与共享内存
  • OpenLayers 入门指南【二】:坐标系与投影转换
  • linux进程信号II
  • Node.js特训专栏-实战进阶:16. RBAC权限模型设计
  • 基于YOLOv7的改进模型:集成Swin Transformer和ASFF模块
  • 26-计组-数据通路
  • 【软件开发】使用 Spring WebFlux 进行请求校验
  • iOS ish app 打印时间
  • HJ8 合并表记录 10:35
  • Vue中的render()函数
  • 【LeetCode数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
  • 为什么要有延时回调?
  • 【实证分析】上市公司绿色战略数据集(2000-2023年)
  • 如何设计一个合理的 Java Spring Boot 项目结构
  • C++ 强制类型转换
  • 【读书笔记】《C++ Software Design》第六章深入剖析 Adapter、Observer 和 CRTP 模式
  • 开机自动启动同花顺,并设置进程优先级为高
  • Linux驱动开发1:设备驱动模块加载与卸载
  • 【Linux学习笔记】认识信号和信号的产生
  • JAVA JVM虚拟线程
  • HTML 初体验