vue3中 ref() 和 reactive() 的区别

在 Vue 3 中,ref()reactive() 是两种核心的响应式 API,用于创建和管理响应式数据。它们各有适用场景,理解它们的区别和用法对开发至关重要。以下是详细对比和示例:


1. ref() 的用法

1.1 基本概念
  • ref() 用于创建一个响应式引用,适用于基本数据类型(如 numberstringboolean)和复杂数据类型(如对象、数组)。
  • 返回值是一个带有 .value 属性的对象,即使传入的是复杂数据类型,也需通过 .value 访问或修改值。
1.2 使用场景
  • 需要直接操作基本数据类型(如计数器、布尔值)。
  • 需要将整个对象或数组作为单一值管理(如动态替换整个对象)。
  • 需要与 Vue 2 的 this.$data 行为兼容。
1.3 示例
import { ref } from 'vue';// 基本数据类型
const count = ref(0); // 创建一个响应式整数
console.log(count.value); // 读取值:0
count.value++; // 修改值:1// 复杂数据类型
const user = ref({ name: 'Alice', age: 20 }); // 创建一个响应式对象
console.log(user.value.name); // 读取对象属性
user.value.age = 21; // 修改对象属性// 数组
const list = ref([1, 2, 3]); // 创建一个响应式数组
list.value.push(4); // 修改数组
1.4 模板中使用

在模板中无需 .value,Vue 会自动解包:

<template><div>{{ count }}</div> <!-- 自动显示 count.value --><div>{{ user.name }}</div> <!-- 自动显示 user.value.name -->
</template>

2. reactive() 的用法

2.1 基本概念
  • reactive() 用于创建一个响应式对象,适用于复杂数据类型(对象或数组)。
  • 返回值是一个代理对象(Proxy),直接访问或修改属性即可触发响应式更新,无需 .value
2.2 使用场景
  • 管理嵌套复杂的对象或数组(如表单数据、配置对象)。
  • 需要直接操作对象属性而不想用 .value
2.3 示例
import { reactive } from 'vue';// 对象
const user = reactive({ name: 'Bob', age: 25 }); // 创建响应式对象
console.log(user.name); // 直接访问属性
user.age = 26; // 直接修改属性// 数组
const list = reactive([1, 2, 3]); // 创建响应式数组
list.push(4); // 直接修改数组
2.4 模板中使用

直接绑定属性名:

<template><div>{{ user.name }}</div> <!-- 直接访问 user.name --><div>{{ list[0] }}</div> <!-- 直接访问数组元素 -->
</template>

3. ref() 与 reactive() 的区别

特性ref()reactive()
适用数据类型基本类型、对象、数组仅对象或数组
返回值类型带 .value 的对象代理对象(Proxy)
访问/修改方式refValue.valuereactiveObject.property
模板中使用自动解包,无需 .value直接访问属性
深度响应式是(若传入对象,内部会调用 reactive是(嵌套对象/数组自动代理)
替换整个对象可以(ref.value = newObject不推荐(直接替换会丢失响应式)
性能优化基础类型更轻量复杂对象更高效

4. 综合示例对比

4.1 场景:计数器
  • ref()
    const count = ref(0);
    function increment() {count.value++;
    }
  • reactive()
    const state = reactive({ count: 0 });
    function increment() {state.count++;
    }
4.2 场景:表单数据
  • ref()
    const formData = ref({ name: '', email: '' });
    formData.value.name = 'Alice'; // 修改需 .value
  • reactive()
    const formData = reactive({ name: '', email: '' });
    formData.name = 'Alice'; // 修改无需 .value
4.3 场景:动态替换对象
  • ref()
    const user = ref({ name: 'Alice' });
    user.value = { name: 'Bob' }; // 安全替换整个对象
  • reactive()
    const user = reactive({ name: 'Alice' });
    user = reactive({ name: 'Bob' }); // 错误!不能直接替换 reactive 对象

5. 企业级最佳实践

  1. 选择原则

    • 基础类型 → ref()
    • 对象/数组 → reactive()
    • 需要替换整个对象 → ref()
    • 嵌套复杂结构 → reactive()
  2. 避免陷阱

    • 解构响应式对象:使用 toRefs() 保持响应式。
      const state = reactive({ count: 0, name: 'Alice' });
      const { count, name } = toRefs(state); // 保持响应式
    • 大型静态数据:避免用 reactive() 包裹,改用 markRaw() 标记非响应式。
  3. 性能优化

    • 高频更新基础类型(如动画帧数) → 优先 ref()
    • 大型嵌套对象 → 优先 reactive()

6. 总结

  • ref():适合简单值或需要替换整个对象的场景,使用 .value 访问。
  • reactive():适合复杂嵌套对象,直接访问属性,代码更简洁。
  • 核心区别ref() 是 reactive() 的“包装器”,在处理对象时内部会调用 reactive(),但需要通过 .value 操作。

根据实际需求选择合适的 API,可以提升代码的可维护性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96367.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96367.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别加班!这款Axure移动端元件库,让你原型效率提升300%

一、 产品概述 这是一套专为 Axure RP 9/10/11 设计的高质量、高保真移动端&#xff08;APP&#xff09;组件库。它旨在帮助产品经理、UI/UX 设计师和交互设计师快速、高效地绘制出美观且交互丰富的移动端原型&#xff0c;极大提升设计效率和原型保真度。 二、 核心内容与特点…

深入理解synchronized:从使用到原理的进阶指南

目录 一、核心机制深度解析 1. 对象头&#xff08;Object Header&#xff09;与Mark Word的奥秘 2. Monitor&#xff1a;同步的实质 二、锁升级的全过程与底层操作 1. 无锁 -> 偏向锁 2. 偏向锁 -> 轻量级锁 3. 轻量级锁 -> 重量级锁 三、高级话题与实战调优 …

4.1 - 拖链电缆(柔性电缆)与固定电缆

本文介绍固定电缆和拖链专用线缆的对比、以及使用注意事项。尤其是在伺服的电缆选型上&#xff0c;一定要注意。总结成两点&#xff1a;1). 在移动场合&#xff0c;一定要选用拖链电缆&#xff0c;不要用普通电缆去代替&#xff0c;否则很快就会损坏&#xff0c;甚至造成安全隐…

S32K3平台eMIOS 应用说明

S32K3 系列 eMIOS 介绍 1.1 资源介绍 该设备具有 3 个 eMIOS 模块&#xff0c;每个模块的配置如表 1.1 所示。1.2 功能介绍 eMIOS 提供了用于生成或测量时间事件的功能。它使用 UCs&#xff0c;您可以为不同的芯片应 用中的不同功能进行编程。此外&#xff0c;eMIOS 体系结构允…

Next.js中服务器端渲染 (SSR) 详解:动态内容与 SEO 的完美结合

Next.js中服务器端渲染 (SSR) 详解&#xff1a;动态内容与 SEO 的完美结合 作者&#xff1a;码力无边在上一篇文章中&#xff0c;我们深入探讨了静态站点生成 (SSG) 的强大之处&#xff0c;它通过在构建时预先生成页面&#xff0c;为用户提供了极致的访问速度。但现实世界是动态…

c# winform 使用DevExpress制作表格

环境配置创建c# winform 新项目 test_devexpress添加引用把DevExpress.XtraGrid.v17.1.dll拖到工具箱在界面中&#xff0c;加入2个 GridControl设计器代码&#xff1a;namespace test_devexpress {partial class Form1{/// <summary>/// 必需的设计器变量。/// </summ…

数据库之间如何同步

数据库之间如何同步&#xff1a;三种高效方法详解 数据同步无小事&#xff0c;选对方法事半功倍 在现代数据驱动的环境中&#xff0c;​​数据库之间如何同步​​是确保业务连续性和数据一致性的核心技术。本文将深入介绍三种主流的数据库同步方法&#xff0c;帮助您根据实际需…

《我的世界》中实现强化学习(RL)算法

在《我的世界》中实现强化学习&#xff08;RL&#xff09;是一个巨大的挑战&#xff0c;而奖励函数&#xff08;Reward Function&#xff09;的设计是其中最核心、最困难的部分&#xff0c;直接决定了算法能否成功学习。 下面我将为你提供一个系统的设计框架、策略和注意事项。…

智能光场:深度学习重构计算光学成像新范式!

1.掌握深度学习算法的原理和应用&#xff0c;剖析计算成像主流研究范围及关联的统一计算范式&#xff0c;能够运用深度学习技术对光学成像系统进行创新设计和优化。2.掌握利用深度学习从成像设备优化设计、典型计算成像任务以及后端的计算机视觉任务的认知框架&#xff0c;并掌…

深入理解 MyBatis-Plus 的 QueryWrapper:动态 SQL 构建的利器

关键词&#xff1a;MyBatis-Plus、QueryWrapper、动态 SQL、Java、ORM 一、引言 在 Java 后端开发中&#xff0c;MyBatis-Plus&#xff08;简称 MP&#xff09;作为 MyBatis 的增强工具&#xff0c;极大地简化了 CRUD 操作。而其中最核心的功能之一&#xff0c;就是动态 SQL 的…

WMIC用法

WMIC用法基本语法结构1. 全局开关&#xff08;可选&#xff0c;控制整体行为&#xff09;2. 别名&#xff08;Alias&#xff09;3. 动词&#xff08;Verb&#xff09;4. 参数&#xff08;可选&#xff09;常用示例帮助命令WMIC&#xff08;Windows Management Instrumentation …

Spring Boot--yml配置信息书写和获取

案例&#xff1a;Spring Boot整合Mybatis步骤一&#xff1a;导入依赖步骤二&#xff1a;添加数据库需要的数据源配置步骤三&#xff1a;编写实体类步骤四&#xff1a;创建mapper类&#xff0c;操作数据库步骤五&#xff1a;创建Service接口和接口实现类步骤六&#xff1a;创建C…

创作纪念日·512天

嘿嘿&#xff0c;不知不觉间&#xff0c;已经到了512天创作纪念日了。 回忆 遥想我在《我的创作纪念日》一篇中写道&#xff0c;想要改名为 十二 &#xff0c;作为对过去生活的怀念&#xff0c;没想到这个名字被抢了&#xff0c;好可惜。 想到25年4月13日写纪念日博客时的自己…

在 Berachain 上,如何通过 BERA 实现一鱼多吃?

Berachain 的 PoL&#xff08;Proof of Liquidity&#xff09;机制是其最具辨识度的创新之一。通过将 DeFi 的激励逻辑深度嵌入共识层&#xff0c;不仅为底层网络注入了充足的流动性&#xff0c;保障了安全性&#xff0c;同时也有效推动了生态应用的增长&#xff0c;更为用户创…

LangGraph和aiagent

1. LangGraph&#xff1a;用图思维重构Agent工作流LangGraph是LangChain团队开源的图式Agent编排框架&#xff0c;它基于"有向图"模型&#xff0c;将Agent的运行流程抽象为"节点 状态流转"。其核心设计理念是用有向状态图&#xff08;Directed State Grap…

《从iptables到ipvs:云原生网络转发的性能拐点突破》

这套基于Spring Cloud Alibaba搭建的架构,部署于阿里云ACK集群的10个4核8G节点上,默认配置6个Pod副本,搭配HPA弹性扩缩容机制与Ingress网关流量分发,理论上具备应对3倍日常流量的承载能力。然而实际运行中,每日早9点、午2点、晚8点三次流量峰值来临时,订单服务会在120秒内…

大数据存储域——Kafka设计原理

摘要本文主要介绍了Kafka的架构原理、消息订阅模式以及在金融风控等领域的应用。Kafka作为数据中转站&#xff0c;可同步不同系统数据&#xff0c;支持事件驱动架构&#xff0c;广泛应用于金融支付与风控场景。其架构包括Producer、Broker、Topic、Partition、Replication、Mes…

[特殊字符] GitHub 热门开源项目速览(2025/09/09)

今天为大家整理了近期 GitHub 上热度较高的开源项目&#xff0c;涵盖 AI Agent、加密计算、操作系统、机器人、PDF 工具 等多个方向。让我们一起看看都有哪些值得关注的项目吧&#xff01; &#x1f539; AI Agents & 开发者工具 parlant &#xff08;⭐ 10.9k | ⬆️ 117…

OpenHarmony之USB Manager 架构深度解析

1. 整体架构 OpenHarmony USB管理器采用三层架构设计: USB API:提供USB的基础API,主要包含查询USB设备的列表、设备插拔通知、USB HOST/DEVICE 功能切换、批量数据传输、控制命令传输、USB设备打开的权限控制及USB device模式下的function功能切换等。 USB Service:主要实…

java面试中经常会问到的mysql问题有哪些(基础版)

文章目录一、基础概念与存储引擎二、索引设计与优化&#xff08;高频重点&#xff09;三、事务与锁&#xff08;核心原理&#xff09;四、SQL性能优化与问题排查五、高可用与数据安全六、其他高频细节问题在Java面试中&#xff0c;MySQL作为最常用的关系型数据库&#xff0c;是…