ref() 和 reactive()响应性 浅解
文章目录
- 1. `ref()` 和 `reactive()` 的区别
- 2. `解构` 详解
- 2.1. 什么是解构
- 2.2. 解构避免丢失响应性的办法
- 2.2.1. 解决方案:`toRefs()` 保持响应性
- 2.2.2. 解决方案: `toRef()`保持响应性
- 3. 最佳实践
在 Vue 3 中,ref() 和 reactive() 都是用于响应式数据管理的 API,它们的主要作用是让数据具有响应性,使 Vue 组件在数据变化时能够自动更新视图。它们有一定的关联,但用法和适用场景有所不同。
1. ref() 和 reactive() 的区别
| 对比点 | ref() | reactive() |
|---|---|---|
| 适用场景 | 适用于基本类型(Number、String、Boolean)和对象 | 适用于对象(Object、Array、Map、Set等) |
是否需要 .value | 需要:count.value | 不需要,直接访问属性:state.count |
| 是否可以解构 | 不能直接解构,会丢失响应性 | 不能直接解构,会丢失响应性 |
| 适用于数组/对象 | 适用于任意类型的数据,但访问对象时需要 .value | 适用于复杂的对象和数组 |
| 底层实现 | ref 内部使用 reactive 处理对象 | 使用 Proxy 代理对象,实现响应性 |
2. 解构 详解
| 情况 | 示例 | 是否丢失响应性? | 原因 | 解决方案 |
|---|---|---|---|---|
ref(基本类型) | const count = ref(0);count.value++ | ✅ 不会 | count 本身是 ref,Vue 追踪 count.value | 直接 count.value++ |
ref(对象类型) 并直接修改 .value | const user = ref({ name: 'Alice' });user.value.name = 'Bob'; | ✅ 不会 | user.value 仍然是响应式对象 | 直接修改 user.value.name |
解构 ref(对象).value | const { name } = user.value;name = 'Bob'; | ❌ 会丢失 | name 是普通变量,Vue 不再追踪 | 使用 toRefs(user.value) |
解构 reactive(对象) | const user = reactive({ name: 'Alice' });const { name } = user;name = 'Bob'; | ✅ 不会 | reactive 生成的是 Proxy,解构后仍然保持响应性 | 直接解构 const { name } = user; |
reactive 对象包含 ref() | const user = reactive({ name: ref('Alice') });user.name = 'Bob'; | ✅ 不会 | user.name 是 ref,Vue 能追踪 user.name.value | 访问 user.name.value |
reactive 里存 ref 并解构 | const user = reactive({ name: ref('Alice') });const { name } = user;name = 'Bob'; | ❌ 会丢失 | name 变成 ref,但解构后 Vue 不会追踪 name.value | 改为 toRef(user, 'name') |
解构 reactive() 并使用 toRefs() | const user = reactive({ name: 'Alice' });const { name } = toRefs(user); | ✅ 不会 | toRefs() 把 user.name 转换为 ref,仍然响应式 | 继续 name.value = 'Bob' |
2.1. 什么是解构
解构是 JavaScript用于从对象或数组中提取值的语法,允许你将数据拆分并存储到独立的变量中。
看个例子,一眼便知
<script setup>
import { reactive } from 'vue';const state = reactive({count: 0,message: 'Hello'
});// ❌ 直接解构(会丢失响应性)
let { count, message } = state;const increment = () => {count++; // ❌ 这里不会触发视图更新
};
</script><template><p>{{ count }}</p> <!-- 不会更新 --><button @click="increment">+</button>
</template>
2.2. 解构避免丢失响应性的办法
在 Vue 3 中,reactive() 返回的对象在解构后会丢失响应性,这是因为 reactive() 使用的是 Proxy,而解构时只会拷贝属性值,而不会保留 Proxy 代理能力。
2.2.1. 解决方案:toRefs() 保持响应性
toRefs(state)把state的每个属性变成ref(),这样解构出来的count和message就是ref,修改.value仍然会触发 Vue 的响应式系统。
toRefs() 用于将 reactive 对象的属性转换成 ref,这样解构后仍然保持响应性:
<script setup>
import { reactive, toRefs } from 'vue';const state = reactive({count: 0,message: 'Hello'
});// ✅ 使用 toRefs() 让解构后的变量仍保持响应性
const { count, message } = toRefs(state);const increment = () => {count.value++; // ✅ 这里会触发视图更新
};
</script><template><p>{{ count }}</p> <!-- 视图会更新 --><button @click="increment">+</button>
</template>
2.2.2. 解决方案: toRef()保持响应性
如果你只想让某个属性保持响应性,而不是整个 state,可以使用 toRef():
<script setup>
import { reactive, toRef } from 'vue';const state = reactive({count: 0,message: 'Hello'
});// ✅ 只把 count 变成 ref
const count = toRef(state, 'count');const increment = () => {count.value++; // ✅ 仍然是响应式的
};
</script><template><p>{{ count }}</p><button @click="increment">+</button>
</template>
3. 最佳实践
- 基本类型 ➝
ref() - 对象 ➝
reactive() - 解构
reactive➝ 用toRefs() - 解构
ref(对象).value➝ 不能直接解构,必须用toRefs()
相关文章:
ref() 和 reactive()响应性 浅解
文章目录 1. ref() 和 reactive() 的区别2. 解构 详解2.1. 什么是解构2.2. 解构避免丢失响应性的办法2.2.1. 解决方案:toRefs() 保持响应性2.2.2. 解决方案: toRef()保持响应性 3. 最佳实践 在 Vue 3 中,ref() 和 reactive() 都是用于响应式数…...
聊一聊vue如何实现角色权限的控制的
大家好,我是G探险者。 关于角色与权限控制,通常是分为两大类:一种是菜单权限;一种是操作权限。 菜单权限是指,每个角色对应着可以看到哪些菜单,至于每个菜单里面的每个按钮,比如增删改查等等这类…...
TensorFlow深度学习实战——构建卷积神经网络实现CIFAR-10图像分类
TensorFlow深度学习实战——构建卷积神经网络实现CIFAR-10图像分类 0. 前言1. CIFAR-10 数据集介绍2. CIFAR-10 图像分类3. 提升模型性能3.1 增加网络深度3.2 数据增强 4. 模型测试相关链接 0. 前言 我们已经学习了卷积神经网络 (Convolutional Neural Network, CNN) 的基本概…...
服务器创建conda环境并安装使用jupyter
1.创建conda环境 conda create --name myenv python3.8 conda activate myenv其中 myenv 是您想要创建的环境名称,可以根据需要替换为其他名称。2.安装juypter conda install jupyter3.启动juypter jupyter notebook复制链接到浏览器打开 4.设置jupyter使用的 …...
形参和实参
形参(形式参数) 函数定义时指定的参数,形参是用来接收数据的,函数定义时,系统不会为形参申请内存,只有当 函数调用时,系统才会为形参申请内存。主要用于存储实际参数,并且当函数返…...
【HarmonyOS Next】鸿蒙监听手机按键
【HarmonyOS Next】鸿蒙监听手机按键 一、前言 应用开发中我们会遇到监听用户实体按键,或者扩展按键的需求。亦或者是在某些场景下,禁止用户按下某些按键的业务需求。 这两种需求,鸿蒙都提供了对应的监听事件进行处理。 onKeyEvent 默认的…...
【Spring详解五】bean的加载
五、bean的加载 当我们显示或者隐式地调用 getBean() 时,则会触发加载 bean 阶段。示例代码如下: public class AppTest {Testpublic void MyTestBeanTest() {BeanFactory bf new XmlBeanFactory( new ClassPathResource("spring-config.xml"…...
5.8 Soft Prompt技术:提示编码器的微调革命
Soft Prompt技术:提示编码器的微调革命 一、Prompt Encoder技术全景图 mindmap root((Prompt Encoder)) P-Tuning v1 双向LSTM编码 可微提示优化 P-Tuning v2 多层感知机编码 任务特定初始化 Prompt Encoder 可学习提示向量 层级提示插入 Prompt Encoder的核心优…...
Qt之多线程处理
在现代应用程序开发中,多线程处理是提高程序性能和响应速度的重要手段。Qt作为一个功能强大的跨平台C++框架,提供了丰富的多线程支持。 Qt多线程基础 Qt中的多线程处理主要依赖于QThread类。QThread类封装了底层的线程启动、运行和终止等细节,每个QThread对象代表一个独立…...
ThinkPHP(TP)如何做安全加固,防webshell、防篡改、防劫持、TP漏洞防护
ThinkPHP是一款非常知名的PHP框架,很多知名CMS系统都是采用TP框架进行二次开发而来,当然ThinkPHP本身也可以直接建站,开源免费、功能强大,深受广大用户喜欢。 虽然ThinkPHP非常优秀,但是为了保障网站安全,我…...
例题:求算法的时间复杂度
xn; // n>1 y0; while(x>(y1)*(y1)) y; 算法行为解析 初始化:x n(n > 1),y 0。循环条件:while (x > (y1)*(y1))。循环体:每次迭代中 y 递增 1。 目标:找到最大的整数 y&#x…...
MySQL(1)基础篇
执行一条 select 语句,期间发生了什么? | 小林coding 目录 1、连接MySQL服务器 2、查询缓存 3、解析SQL语句 4、执行SQL语句 5、MySQL一行记录的存储结构 Server 层负责建立连接、分析和执行 SQL存储引擎层负责数据的存储和提取。支持InnoDB、MyIS…...
分裂栅结构对碳化硅MOSFET重复雪崩应力诱导退化的抑制作用
标题 Suppression Effect of Split-Gate Structure on Repetitive Avalanche Stress Induced Degradation for SiC MOSFETs(TED 24年) 文章的研究内容 这篇文章的研究探讨了重复雪崩应力对碳化硅(SiC)MOSFET器件退化的影响&am…...
Could not initialize class io.netty.util.internal.Platfor...
异常信息: Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class io.netty.util.internal.PlatformDependent0 Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.reflect.InaccessibleObjec…...
贝叶斯估计习题
x x x 是来自如下指数分布的一个观察值 p ( x ∣ θ ) e − ( x − θ ) , x ≥ θ p(x|\theta)e^{-(x-\theta)},x\geq\theta p(x∣θ)e−(x−θ),x≥θ 取柯西分布作为 θ \theta θ 的先验分布 π ( θ ) 1 π ( 1 θ 2 ) \pi(\theta)\frac{1}{\pi(1\theta^2)} π(θ)π…...
JavaEE基础之- xml
目录 一、xml概述 1.什么是xml 2.W3C组织 3.XML的作用 4.XML与HTML比较 5.XML和properties(属性文件)比较 二、XML语法概述 1.文档展示 2.XML文档的组成部分 3.xml文档声明 3.1 什么是xml文档声明 3.2 xml文档声明结构 4.xml元素 4.1 xml元素的格…...
网络运维学习笔记 012网工初级(HCIA-Datacom与CCNA-EI)某机构新增:GRE隧道与EBGP实施
文章目录 GRE隧道(通用路由封装,Generic Routing Encapsulation)协议号47实验:思科:开始实施: 华为:开始实施: eBGP实施思科:华为: GRE隧道(通用路…...
RK3568开发板/电脑/ubuntu处于同一网段互通
1.查看无线局域网适配器WLAN winR输入cmd打开电脑终端输入ipconfig或arp -a查看无线局域网IP地址,这就是WIFI. 这里的IPv4是192.168.0.147,默认网关是192.168.0.1,根据网关地址配以太网IP, ubuntu的IP,和rk3568的IP。 且IP范围为192.168.…...
Java常用注解--@FunctionalInterface 函数式接口
文章目录 1 定义要求2 实现方式1. Lambda 表达式2. 方法引用3. 内置函数式接口 3 自定义函数式接口的典型用途1 简化回调逻辑1.1 使用函数式接口简化,1.2 灵活扩展 2 组合函数 4 实践举例4.1 资源清理(自动关闭)4.2 策略模式(动态…...
Xen Center虚拟机Centos 7.x磁盘扩容
文章目录 概要XenCenter虚拟机操作系统命令概览扩容步骤 概要 适用于Centos 7.x系统磁盘扩容,不区分是否虚拟机或者实体系统 XenCenter 使用Xen Center客户端给对应的虚拟机添加一块磁盘后,启动虚拟机系统在系统中进行扩容 虚拟机操作系统 Centos 7.…...
如何调用 DeepSeek API:详细教程与示例
目录 一、准备工作 二、DeepSeek API 调用步骤 1. 选择 API 端点 2. 构建 API 请求 3. 发送请求并处理响应 三、Python 示例:调用 DeepSeek API 1. 安装依赖 2. 编写代码 3. 运行代码 四、常见问题及解决方法 1. API 调用返回 401 错误 2. API 调用返回…...
MySQL_事务的四大特性
1.事务的什么 在学习MySQL的初期,我们通常都是一个一个sql语句的执行,但是在实际开发过程中,我们经常是多个sql语句一起执行,这种多个sql语句在逻辑上要一起执行的就可以看做是一个事务,组成这个事务的多个sql&#x…...
如何在Jenkins上查看Junit报告
在 Jenkins 上查看 JUnit 报告通常有以下几个步骤: 构建结果页面: 首先,确保你的 Jenkins 构建已经执行完毕,并且成功生成了 JUnit 报告。前往 Jenkins 主页面,点击进入相应的项目或流水线。 构建记录: 选择你想查看的特定构建记…...
【深度学习】计算机视觉(CV)-图像生成-风格迁移(Style Transfer)
风格迁移(Style Transfer) 风格迁移是一种计算机视觉技术,可以将一张图像的内容和另一张图像的风格融合在一起,生成一张既保留原始内容,又带有目标风格的全新图像!这种方法常用于艺术创作、图像增强、甚至…...
Nginx 配置:alias 和 root 的区别
在 Nginx 的配置中,alias 和 root 是两个用于映射文件路径的重要指令。虽然它们的功能表面相似,实际使用中却有显著的差异。如果不清楚两者的用法和特点,可能会导致资源路径错误或访问异常。本文将详细解析它们的区别,并提供实用示…...
深入理解 QObject的作用
QObject 作为 Qt 库中所有对象的基类,其地位无可替代。几乎 Qt 框架内的每一个类,无论是负责构建用户界面的 QWidget,还是专注于数据处理与呈现的 QAbstractItemModel,均直接或间接继承自 QObject。这种继承体系赋予 Qt 类库高度的…...
在项目中调用本地Deepseek(接入本地Deepseek)
前言 之前发表的文章已经讲了如何本地部署Deepseek模型,并且如何给Deepseek模型投喂数据、搭建本地知识库,但大部分人不知道怎么应用,让自己的项目接入AI模型。 文末有彩蛋哦!!! 要接入本地部署的deepsee…...
JAVA中常用类型
一、包装类 1.1 包装类简介 java是面向对象的语言,但是八大基本数据类型不符合面向对象的特征。因此为了弥补这种缺点,为这八中基本数据类型专门设计了八中符合面向面向对象的特征的类型,这八种具有面向对象特征的类型,就叫做包…...
PostgreSQL学习的必要性
据分析师、运维工程师,还是技术决策者,掌握 PostgreSQL 都能带来显著的优势。以下是其必要性的核心要点:企业级开源数据库的首选 功能全面性:PostgreSQL 支持复杂的 SQL 查询、事务(ACID 特性)、多版本并发…...
使用 GPTQ 进行 4 位 LLM 量化
权重量化方面的最新进展使我们能够在消费级硬件上运行大量大型语言模型,例如 RTX 3090 GPU 上的 LLaMA-30B 模型。这要归功于性能下降最小的新型 4 位量化技术,例如GPTQ、GGML和NF4。 在本文中,我们将探索流行的 GPTQ 算法,以了解…...
