好的,这是 Vue 3 中 ref()reactive() 这两个核心响应式 API 之间区别的详细解释。

简单来说,它们是创建响应式数据的两种方式,主要区别在于处理的数据类型访问数据的方式

核心区别速查表

特性ref()reactive()
适用类型任何类型 (字符串、数字、布尔、对象、数组等)仅限对象类型 (Object, Array, Map, Set)
访问/修改在 JS 中必须通过 .value 属性在 JS 中直接访问,像普通对象一样
模板中使用不需要 .value,Vue 会自动解包直接访问,像普通对象一样
重新赋值✅ 可以对整个 .value 重新赋值不能直接对整个变量重新赋值,会破坏响应性
底层原理通过一个包含 value 属性的对象来实现包装使用 ES6 的 Proxy 实现对整个对象的劫持

ref():更灵活的“盒子”

ref() 的设计初衷是为了处理原始数据类型(Primitive Types),如字符串、数字、布尔值。当然,它也可以用来包装对象。

你可以把 ref() 想象成一个万能的、响应式的“盒子”。无论你放什么进去,它都会把它装进一个特殊的盒子里。要访问或修改里面的东西,你需要打开这个盒子,也就是访问它的 .value 属性。

ref() 的关键点:
  1. 接受任何值ref('some string'), ref(123), ref(true), ref({ name: '张三' }) 都可以。
  2. JS 中必须用 .value:在 <script setup>setup() 函数中,访问和修改 ref 创建的变量时,必须通过 .value
  3. 模板中自动解包:在 <template> 中使用时,Vue 非常智能,会自动“打开盒子”,所以你不需要.value
ref() 示例代码:
<template><div><p>计数: {{ count }}</p><button @click="increment">增加</button><p>用户信息: {{ user.name }}</p></div>
</template><script setup>
import { ref } from 'vue';// 1. 用于原始类型
const count = ref(0);// 2. 在 JS/TS 中,必须通过 .value 来访问和修改
function increment() {count.value++;
}// 3. 也可以用于对象,但同样需要 .value
const user = ref({ name: '张三' });
console.log(user.value.name); // 输出: 张三
</script>

reactive():对象的“代理”

reactive() 专门用于将对象类型(包括普通对象、数组、Map、Set)的数据转换成响应式数据。

它不做任何包装,而是直接返回一个原始对象的“代理” (Proxy)。你对这个代理对象的所有操作(读取、修改、添加、删除属性)都会被 Vue 拦截,从而触发视图更新。

reactive() 的关键点:
  1. 只能用于对象reactive({ ... }), reactive([ ... ]) 可以,但 reactive(123) 会报错
  2. 直接访问:使用起来和普通 JS 对象一模一样,不需要 .value
  3. 不能重新赋值:这是一个非常重要的陷阱!你不能直接用一个新的对象替换整个 reactive 变量,否则会失去响应性,因为这切断了原始代理对象的连接。
reactive() 示例代码:
<template><div><p>用户信息: {{ state.user.name }} - {{ state.user.age }} 岁</p><p>他的爱好: {{ state.hobbies.join('、') }}</p><button @click="updateUser">更新用户信息</button></div>
</template><script setup>
import { reactive } from 'vue';// 1. 只能用于对象或数组
const state = reactive({user: {name: '李四',age: 30},hobbies: ['编程', '音乐']
});function updateUser() {// 2. 直接修改属性,像普通对象一样state.user.age++;state.hobbies.push('运动');// ❌ 错误做法:直接替换整个对象会导致响应性丢失!// state = { user: { name: '王五', age: 40 }, hobbies: [] }; // ✅ 正确做法:逐个属性赋值或使用 Object.assign// Object.assign(state, { user: { name: '王五', age: 40 }, hobbies: [] });
}
</script>

总结与使用建议

  1. 优先使用 ref()

    • 当你需要处理原始数据类型(字符串、数字、布尔值)时,必须使用 ref()
    • 当你不确定数据类型时,ref() 是更安全、更通用的选择。
    • 社区中有一种流行的风格是“始终使用 ref()”,以保持代码风格的一致性。因为 ref() 既能处理原始类型,也能处理对象。
  2. 在特定场景下使用 reactive()

    • 当你明确知道你需要一个复杂的、多层级的响应式对象或数组时,使用 reactive() 可以让代码更简洁,因为你不需要到处写 .value。例如,管理一个复杂的表单状态。

一个简单的记忆法则

  • ref -> 凡事用它准没错,就是记得在 JS 里加 .value
  • reactive -> 专为对象服务,用法自然,但小心别整个替换掉它。

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

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

相关文章

目标检测数据集——交通信号灯红绿灯检测数据集

在智能交通系统迅速发展的背景下&#xff0c;准确且实时地识别交通信号灯的状态对于提升道路安全和优化交通流量管理至关重要。 无论是自动驾驶汽车还是辅助驾驶技术&#xff0c;可靠地检测并理解交通信号灯的指示——特别是红灯与绿灯的区别——是确保交通安全、避免交通事故…

哪款即时通讯服务稳定性靠谱?18家对比

本文将深入对比18家 IM 服务商&#xff1a;1.网易云信; 2. 有度即时通; 3. 环信; 4. 小天互连; 5. 企达即时通讯; 6. 敏信即时通讯; 7. 360织语; 8. 容联云通讯; 9. 云之讯 UCPaaS等。 在如今的数字化时代&#xff0c;即时通讯&#xff08;IM&#xff09;软件已经成为企业日常运…

【Android】Flow学习及使用

目录 前言基础基本用法概念与核心特点Android中使用与LiveData对比热流StateFlow、SharedFlow 搜索输入流实现实时搜索 前言 ​ Flow是kotlin协程库中的一个重要组成部分&#xff0c;它可以按顺序发送多个值&#xff0c;用于对异步数据流进行处理。所谓异步数据流就是连续的异…

idea常做的配置改动和常用插件

IDEA 使用 最强教程&#xff0c;不多不杂。基于idea旗舰版 2019.2.3左右的版本&#xff0c;大多数是windows的&#xff0c;少数是mac版的 一、必改配置 1、ctrl滚轮 调整字体大小 全局立即生效&#xff1a;settings -> Editor -> General -> Change font size with …

3. 物理信息神经网络(PINNs)和偏微分方程(PDE),用物理定律约束神经网络

导言&#xff1a;超越时间&#xff0c;拥抱空间 在前两篇章中&#xff0c;我们已经走过了漫长而深刻的旅程。我们学会了用常微分方程&#xff08;ODE&#xff09;来描述事物如何随时间演化&#xff0c;从一个初始状态出发&#xff0c;描绘出一条独一无二的生命轨迹。我们还学会…

Flutter基础(基础概念和方法)

概念比喻StatefulWidget会变魔术的电视机State电视机的小脑袋&#xff08;记信息&#xff09;build 方法电视机变身显示新画面setState按遥控器按钮改变状态Scaffold电视机的外壳 StatefulWidget&#xff1a;创建一个按钮组件。State&#xff1a;保存点赞数&#xff08;比如 i…

K8s——Pod(1)

目录 基本概念 ‌一、Pod 的原理‌ ‌二、Pod 的特性‌ ‌三、Pod 的意义‌ 状态码详解 ‌一、Pod 核心状态详解‌ ‌二、其他关键状态标识‌ ‌三、状态码运维要点‌ 探针 ‌一、探针的核心原理‌ ‌二、三大探针的特性与作用‌ ‌参数详解‌ ‌三、探针的核心意义…

MySQL 存储过程面试基础知识总结

文章目录 MySQL 存储过程面试基础知识总结一、存储过程基础&#xff08;一&#xff09;概述1.优点2.缺点 &#xff08;二&#xff09;创建与调用1.创建存储过程2.调用存储过程3.查看存储过程4.修改存储过程5.存储过程权限管理 &#xff08;三&#xff09;参数1.输入参数2.输出参…

NLP文本数据增强

文章目录 文本数据增强同义词替换示例Python代码示例 随机插入示例Python代码示例 随机删除示例Python代码示例 回译&#xff08;Back Translation&#xff09;示例Python代码示例 文本生成模型应用方式示例Python代码示例 总结 文本数据增强 数据增强通过对原始数据进行变换、…

(LeetCode 每日一题) 594. 最长和谐子序列 (哈希表)

题目&#xff1a;594. 最长和谐子序列 思路&#xff1a;哈希表&#xff0c;时间复杂度0(n)。 用哈希表mp来记录每个元素值出现的次数&#xff0c;然后枚举所有值x&#xff0c;看其x1是否存在&#xff0c;存在的话就可以维护最长的子序列长度mx。 C版本&#xff1a; class Sol…

FreePDF:让看英文文献像喝水一样简单

前言 第一次看英文文献&#xff0c;遇到不少看不懂的英文单词&#xff0c;一个个查非常费劲。 后来&#xff0c;学会了使用划词翻译&#xff0c;整段整段翻译查看&#xff0c;极大提升看文献效率。 最近&#xff0c;想到了一种更快的看文献的方式&#xff0c;那就是把英文PD…

Scikit-learn:机器学习的「万能工具箱」

——三行代码构建AI模型的全栈指南** ### **一、诞生背景&#xff1a;让机器学习从实验室走向大众** **2010年前的AI困境**&#xff1a; - 学术界模型难以工程化 - 算法实现碎片化&#xff08;MATLAB/C主导&#xff09; - 企业应用门槛极高 > **破局者**&#xff1a;Da…

GPT-1论文阅读:Improving Language Understanding by Generative Pre-Training

这篇论文提出了 GPT (Generative Pre-Training) 模型&#xff0c;这是 GPT系列&#xff08;包括 GPT-2, GPT-3, ChatGPT, GPT-4 等&#xff09;的奠基之作。它标志着自然语言处理领域向大规模无监督预训练任务特定微调范式的重大转变&#xff0c;并取得了显著的成功。 文章链接…

Hadoop大数据-Mysql的数据同步工具Maxwell安装与使用( 详解)

目录 一、前置基础知识 1、主从复制&#xff08;Replication&#xff09; 2、数据恢复 3、数据库热备 4、读写分离 5、存储位置及命名 二、Maxwell简介 1、简介 2、Maxwell同步数据特点 2.1.历史记录同步 2.2.断点续传 三、前期准备 1、查看网卡&#xff1a; 2、…

分布式系统的一致性模型:核心算法与工程实践

目录 一、分布式一致性的核心挑战二、主流一致性算法原理剖析1. Paxos&#xff1a;理论基础奠基者2. Raft&#xff1a;工业级首选方案3. ZAB&#xff1a;ZooKeeper的引擎 三、算法实现与代码实战Paxos基础实现&#xff08;Python伪代码&#xff09;Raft日志复制核心逻辑 四、关…

Apache HTTP Server部署全攻略

httpd 简介 httpd&#xff08;Apache HTTP Server&#xff09;是一款历史悠久的开源 Web 服务器软件&#xff0c;由 Apache 软件基金会开发和维护。自 1995 年首次发布以来&#xff0c;Apache 一直是 Web 服务器领域的领导者&#xff0c;以其稳定性、安全性和灵活性著称。根据…

信号处理学习——文献精读与code复现之TFN——嵌入时频变换的可解释神经网络(下)

书接上文: 信号处理学习——文献精读与code复现之TFN——嵌入时频变换的可解释神经网络&#xff08;上&#xff09;-CSDN博客 接下来是重要的代码复现&#xff01;&#xff01;&#xff01;GitHub - ChenQian0618/TFN: this is the open code of paper entitled "TFN: A…

线上故障排查:签单合同提交报错分析-对接e签宝

在企业管理系统中&#xff0c;合同生成与签署环节至关重要&#xff0c;尤其是在使用第三方平台进行电子签署时。本文将通过实际的报错信息&#xff0c;分析如何进行线上故障排查&#xff0c;解决合同生成过程中出现的问题。 #### 1. 错误描述 在尝试生成合同并提交至电子签署…

知攻善防靶机 Linux easy溯源

知攻善防 【护网训练-Linux】应急响应靶场-Easy溯源 小张是个刚入门的程序猿&#xff0c;在公司开发产品的时候突然被叫去应急&#xff0c;小张心想"早知道简历上不写会应急了"&#xff0c;于是call了运维小王的电话&#xff0c;小王说"你面试的时候不是说会应急…

原神八分屏角色展示页面(纯前端html,学习交流)

原神八分屏角色展示页面 - 一个精美的前端交互项目 项目简介 这是一个基于原神游戏角色制作的八分屏展示页面&#xff0c;采用纯前端技术实现&#xff0c;包含了丰富的动画效果、音频交互和视觉设计。项目展示了一些热门原神角色&#xff0c;每个角色都有独立的介绍页面和专属…