当前位置: 首页 > 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.dtcms.com/a/276988.html

相关文章:

  • EWSGAN:自动搜索高性能的GAN生成器架构
  • LeetCode 1156.单字符重复子串的最大长度
  • 维基艺术图片: 数据标注 (2)
  • C语言基础教程(002):变量介绍
  • 一文读懂现代卷积神经网络—使用块的网络(VGG)
  • 基于Prompt结构的语校解析:3H日本语学校信息建模实录(4/500)
  • 08.如何正确关闭文件
  • 数智管理学(三十三)
  • 归并排序递归法和非递归法的简单简单介绍
  • Gin框架统一响应与中间件机制学习笔记
  • DH(Denavit–Hartenberg)矩阵
  • KL散度:信息差异的量化标尺 | 从概率分布对齐到模型优化的核心度量
  • 使用QtTest
  • 反激变换器设计全流程(一)——电路拓扑及工作流程
  • Chrome v109.0.5414.168 绿色便携版 Windows 7/2012R2 最终版 下载
  • 开发语言的优劣势对比及主要应用领域分析
  • GROW领导力模型
  • Unity物理系统由浅入深第四节:物理约束求解与稳定性
  • 【算法分析与设计】研究生第一次算法作业latex源码+pdf
  • docker容器高级管理-dockerfile创建镜像
  • 飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构开发生态
  • Java小白-线程 vs 虚拟线程,Java并发的新旧对决
  • LeetCode--44.通配符匹配
  • Java4种设计模式详解(单例模式、工厂模式、适配器模式、代理模式)
  • Linux的 iproute2 配置:以太网(Ethernet)、绑定(Bond)、虚拟局域网(VLAN)、网桥(Bridge)笔记250713
  • 文心一言大模型4.5系列开源测评
  • 【Leetcode】2410. 运动员和训练师的最大匹配数
  • 预处理器完整功能介绍和示例演示(LESS/SCSS)
  • 笔记-极客-DDD实战-基于DDD的微服务拆分与设计
  • MongoDB数据基本介绍