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

vue3.x 的shallowReactive 与 shallowRef 详细解读

在 Vue 3.x 中,shallowReactive 和 shallowRef 是两个用于创建浅层响应式数据的 API。它们与 reactive 和 ref 类似,但在处理嵌套对象时的行为有所不同。以下是它们的详细解读和示例。

1. shallowReactive

作用

shallowReactive 创建一个浅层响应式对象,只有对象的顶层属性是响应式的,嵌套对象的属性不会转换为响应式。

使用场景

  • 当你只需要对象的顶层属性是响应式,而不关心嵌套对象的响应性时。

  • 当嵌套对象的响应性转换可能带来性能开销时。

示例

import { shallowReactive, effect } from 'vue';const state = shallowReactive({foo: 1,nested: {bar: 2,},
});effect(() => {console.log('foo changed:', state.foo); // 响应式
});effect(() => {console.log('nested.bar changed:', state.nested.bar); // 非响应式
});state.foo = 10; // 触发第一个 effect
state.nested.bar = 20; // 不会触发第二个 effect

解释:

  • state.foo 是响应式的,修改它会触发依赖更新。

  • state.nested.bar 不是响应式的,修改它不会触发依赖更新。


2. shallowRef

作用

shallowRef 创建一个浅层响应式引用,只有 .value 属性本身是响应式的,而 .value 内部的属性不会转换为响应式。

使用场景

  • 当你只需要 .value 是响应式的,而不关心 .value 内部属性的响应性时。

  • 当 .value 是一个复杂对象,且不需要深度监听时。

示例

import { shallowRef, effect } from 'vue';const count = shallowRef({value: 1,
});effect(() => {console.log('count changed:', count.value.value); // 非响应式
});count.value.value = 10; // 不会触发 effect
count.value = { value: 20 }; // 触发 effect

解释:

  • count.value 是响应式的,修改它会触发依赖更新。

  • count.value.value 不是响应式的,但直接修改 count.value 会触发依赖更新。


3. shallowReactive 与 shallowRef 的区别

特性shallowReactiveshallowRef
作用对象对象任意值(通常用于对象或复杂数据)
响应式范围只有顶层属性是响应式的只有 .value 是响应式的
嵌套对象处理嵌套对象的属性不是响应式的.value 内部的属性不是响应式的
典型使用场景只需要顶层属性响应式的对象只需要 .value 响应式的引用

4. shallowReactive 与 reactive 的对比

reactive 的深度响应式

import { reactive, effect } from 'vue';const state = reactive({foo: 1,nested: {bar: 2,},
});effect(() => {console.log('nested.bar changed:', state.nested.bar); // 响应式
});state.nested.bar = 20; // 触发 effect
  • reactive 会将整个对象及其嵌套属性都转换为响应式。

shallowReactive 的浅层响应式

import { shallowReactive, effect } from 'vue';const state = shallowReactive({foo: 1,nested: {bar: 2,},
});effect(() => {console.log('nested.bar changed:', state.nested.bar); // 非响应式
});state.nested.bar = 20; // 不会触发 effect
  • shallowReactive 只将顶层属性转换为响应式,嵌套属性保持不变。


5. shallowRef 与 ref 的对比

ref 的深度响应式

import { ref, effect } from 'vue';const count = ref({value: 1,
});effect(() => {console.log('count.value changed:', count.value.value); // 响应式
});count.value.value = 10; // 触发 effect
  • ref 会将 .value 及其内部属性都转换为响应式。

shallowRef 的浅层响应式

import { shallowRef, effect } from 'vue';const count = shallowRef({value: 1,
});effect(() => {console.log('count.value changed:', count.value.value); // 非响应式
});count.value.value = 10; // 不会触发 effect
count.value = { value: 20 }; // 触发 effect
  • shallowRef 只将 .value 本身转换为响应式,内部属性保持不变。


6. 使用场景总结

shallowReactive

  • 适用于只需要顶层属性响应式的对象。

  • 例如:表单数据的顶层字段。

shallowRef

  • 适用于只需要 .value 响应式的引用。

  • 例如:DOM 元素的引用或不需要深度监听的对象。

7. 注意事项

  1. 性能优化

    shallowReactive 和 shallowRef 可以减少不必要的响应式转换,从而提高性能。
  2. 嵌套对象的响应性

    如果需要嵌套对象的响应性,应该使用 reactive 或 ref
  3. .value 的使用

    shallowRef 的 .value 是响应式的,但 .value 内部的属性不是响应式的。

8. 总结

  • shallowReactive 和 shallowRef 是 Vue 3 提供的浅层响应式 API。

  • shallowReactive 只将对象的顶层属性转换为响应式。

  • shallowRef 只将 .value 本身转换为响应式。

  • 它们适用于需要优化性能或不需要深度响应式的场景。

通过合理使用 shallowReactive 和 shallowRef,可以在保证功能的同时优化 Vue 应用的性能。

相关文章:

vue3.x 的shallowReactive 与 shallowRef 详细解读

在 Vue 3.x 中,shallowReactive 和 shallowRef 是两个用于创建浅层响应式数据的 API。它们与 reactive 和 ref 类似,但在处理嵌套对象时的行为有所不同。以下是它们的详细解读和示例。 1. shallowReactive 作用 shallowReactive 创建一个浅层响应式对…...

鸿蒙NEXT开发-界面渲染(条件和循环)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 目录 1. 渲染-条件渲染 1.1 基本介绍 1.2 使…...

python电影数据分析及可视化系统建设

博主介绍:✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

在本地校验密码或弱口令 (windows)

# 0x00 背景 需求是验证服务器的弱口令,如果通过网络侧校验可能会造成账户锁定风险。在本地校验不会有锁定风险或频率限制。 # 0x01 实践 ## 1 使用 net use 命令 可以通过命令行使用 net use 命令来验证本地账户的密码。打开命令提示符(CMD&#xff0…...

pytest测试专题 - 1.3 测试用例发现规则

<< 返回目录 1 pytest测试专题 - 1.3 测试用例发现规则 执行pytest命令时&#xff0c;可以不输入参数&#xff0c;或者只输入文件名或者目录名&#xff0c;pytest会自己扫描测试用例。那pytest基于什么规则找到用例呢&#xff1f; 文件名&#xff1a;满足文件名称为tes…...

零基础学习人工智能

零基础学习人工智能是一个既充满挑战又极具潜力的过程。以下是一份详细的学习指南&#xff0c;旨在帮助零基础的学习者有效地踏入人工智能领域。 一、理解基本概念 在学习人工智能之前&#xff0c;首先要对其基本概念有一个清晰的认识。人工智能&#xff08;AI&#xff09;是…...

LeetCode热题100- 缺失的第一个正数【JavaScript讲解】

题目&#xff1a; 解题一&#xff1a; 如果不考虑时间复杂度和空间复杂度的话&#xff0c;我们最先想到的办法是先将该数组进行排序和去重&#xff0c;将最初的res结果值设置为1&#xff1b;将然后进行遍历&#xff0c;如果第一项不为1&#xff0c;则返回1&#xff0c;否则根…...

JAVA泛型介绍与举例

Java中&#xff0c;泛型用于编译阶段限制集合中元素的类型&#xff0c;或者限制类中某个属性的类型&#xff0c;编译过程中发生类型擦除&#xff0c;最终还是Object类型。 1. 集合中的泛型 集合默认可以存储任何类型的元素&#xff0c;即Object类型&#xff0c;当使用一个集合…...

【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析③】

ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase03 作者&#xff1a;车端域控测试工程师 更新日期&#xff1a;2025年02月15日 关键词&#xff1a;UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-003测试用例 用例ID测试场景验证要点参考条款预期…...

Vivado生成edif网表及其使用

介绍如何在Vivado中将模块设为顶层&#xff0c;并生成相应的网表文件&#xff08;Verilog文件和edif文件&#xff09;&#xff0c;该过程适用于需要将一个模块作为顶层设计进行综合&#xff0c;并生成用于其他工程中的网表文件的情况。 例如要将fpga_top模块制作成网表给其它工…...

Win10环境借助DockerDesktop部署大数据时序数据库Apache Druid

Win10环境借助DockerDesktop部署最新版大数据时序数据库Apache Druid32.0.0 前言 大数据分析中&#xff0c;有一种常见的场景&#xff0c;那就是时序数据&#xff0c;简言之&#xff0c;数据一旦产生绝对不会修改&#xff0c;随着时间流逝&#xff0c;每个时间点都会有个新的…...

mac 意外退出移动硬盘后再次插入移动硬盘不显示怎么办

第一步&#xff1a;sudo ps aux | grep fsck 打开mac控制台输入如下指令&#xff0c;我们看到会出现两个进程&#xff0c;看进程是root的这个 sudo ps aux|grep fsck 第二步&#xff1a;杀死进程 在第一步基础上我们知道不显示u盘的进程是&#xff1a;62319&#xff0c;我们…...

力扣动态规划-32【算法学习day.126】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#xff01;&#xff01;&#xff01; 习题 1.完全平方数 题目链接:279. 完全…...

【算法进阶详解 第一节】树状数组

【算法进阶详解 第一节】树状数组 前言树状数组基础树状数组原理树状数组能够解决的问题 树状数组提高树状数组区间加&#xff0c;区间和操作二维树状数组 树状数组应用树状数组区间数颜色树状数组二维偏序 前言 树状数组在算法竞赛中十分常见&#xff0c;其能解决二维数点&am…...

【苍穹外卖】学习

软件开发整体介绍 作为一名软件开发工程师,我们需要了解在软件开发过程中的开发流程&#xff0c; 以及软件开发过程中涉及到的岗位角色&#xff0c;角色的分工、职责&#xff0c; 并了解软件开发中涉及到的三种软件环境。那么这一小节&#xff0c;我们将从 软件开发流程、角色…...

Python常见面试题的详解8

1. 变量作用域和查找规则&#xff08;LEGB&#xff09; 作用域层级&#xff1a; Local&#xff1a;函数内部作用域 Enclosing&#xff1a;闭包函数外层作用域 Global&#xff1a;模块全局作用域 Built-in&#xff1a;内置命名空间 查找顺序&#xff1a;L → E → G → B关…...

Deepseek R1模型本地化部署与API实战指南:释放企业级AI生产力

摘要 本文深入解析Deepseek R1开源大模型的本地化部署流程与API集成方案&#xff0c;涵盖从硬件选型、Docker环境搭建到模型微调及RESTful接口封装的完整企业级解决方案。通过电商评论分析和智能客服搭建等案例&#xff0c;展示如何将前沿AI技术转化为实际生产力。教程支持Lin…...

node.js + html调用ChatGPTApi实现Ai网站demo(带源码)

文章目录 前言一、demo演示二、node.js 使用步骤1.引入库2.引入包 前端HTML调用接口和UI所有文件总结 前言 关注博主&#xff0c;学习每天一个小demo 今天是Ai对话网站 又到了每天一个小demo的时候咯&#xff0c;前面我写了多人实时对话demo、和视频转换demo&#xff0c;今天…...

sql语言语法的学习

sql通用语法 sql分类 DDL(操作数据库和表) 操作数据库 操作表_查询 操作表_创建 举例&#xff1a; 操作表_删除 操作表_修改 DML(增删改表中数据) DML添加数据 DML删除数据 DML修改数据 DQL 单表查询 基础查询 条件查询 案例演示&#xff1a; 排序查询 聚合函数 分组查询…...

力扣 最长递增子序列

动态规划&#xff0c;二分查找。 题目 由题&#xff0c;从数组中找一个最长子序列&#xff0c;不难想到&#xff0c;当这个子序列递增子序列的数越接近时是越容易拉长的。从dp上看&#xff0c;当遍历到这个数&#xff0c;会从前面的dp选一个最大的数加上当前数&#xff0c;注意…...

别再死记硬背公式了!用Unity手把手教你写一个能用的PBR着色器(附完整HLSL代码)

从零实现Unity PBR着色器&#xff1a;抛弃理论公式的实战指南 很多开发者学习PBR渲染时都会陷入一个怪圈&#xff1a;啃完十几篇理论文章后&#xff0c;面对Unity编辑器依然无从下手。这篇文章将彻底打破这个循环——我们直接从代码入手&#xff0c;用可运行的HLSL实现一个完整…...

web3-react终极ENS集成指南:5步实现去中心化域名解析

web3-react终极ENS集成指南&#xff1a;5步实现去中心化域名解析 【免费下载链接】web3-react A simple, maximally extensible, dependency minimized framework for building modern Ethereum dApps 项目地址: https://gitcode.com/gh_mirrors/we/web3-react web3-rea…...

保姆级教程:用ENVI5.6和Sarscape搞定高分三号雷达影像预处理(附完整流程与避坑点)

高分三号雷达影像预处理全流程实战指南&#xff1a;从零掌握ENVI5.6与Sarscape核心技巧 当你第一次打开高分三号雷达数据时&#xff0c;那些复杂的复数矩阵和特殊的成像几何是否让你望而生畏&#xff1f;作为国内首颗C波段多极化合成孔径雷达卫星&#xff0c;高分三号在海洋监测…...

Vue组件拖拽排序架构设计与性能优化实践

Vue组件拖拽排序架构设计与性能优化实践 【免费下载链接】Vue.Draggable Vue drag-and-drop component based on Sortable.js 项目地址: https://gitcode.com/gh_mirrors/vu/Vue.Draggable 在现代Web应用中&#xff0c;拖拽排序功能已成为提升用户体验的关键交互方式。V…...

别再手动调参了!用Python+TraCI脚本自动化你的SUMO交通仿真(附完整代码)

别再手动调参了&#xff01;用PythonTraCI脚本自动化你的SUMO交通仿真&#xff08;附完整代码&#xff09; 交通仿真研究常常需要反复调整参数、运行模拟并分析结果&#xff0c;这个过程既耗时又容易出错。想象一下&#xff0c;当你需要测试20种不同的信号灯配时方案&#xff…...

ZDNET编辑亲测:Renpho Eyeris 2眼部按摩仪,缓解眼疲劳头痛的小众神器!

ZDNET编辑亲测&#xff1a;Renpho Eyeris 2 眼部按摩仪&#xff0c;缓解眼疲劳和头痛的小众神器&#xff01;我在电脑前花费大量时间远程工作&#xff0c;作为ZDNET的交易与购物编辑&#xff0c;在Prime Day等特殊时段常需熬夜或早起&#xff0c;长时间看屏幕、接触蓝光&#x…...

告别USBi!用STM32单片机给ADAU1761音频DSP烧写程序的保姆级教程

低成本实现ADAU1761音频DSP自主烧录&#xff1a;STM32全流程替代方案 在音频信号处理领域&#xff0c;ADAU1761凭借其高性价比和集成化设计&#xff0c;成为众多嵌入式开发者的首选。然而传统开发流程中&#xff0c;ADI官方USBi仿真器的依赖性问题始终困扰着开发者——不仅增加…...

Unlock-Music音乐解锁工具:一键解密各大平台加密音乐文件

Unlock-Music音乐解锁工具&#xff1a;一键解密各大平台加密音乐文件 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: ht…...

快速构建kernel32.dll API学习工具:用快马生成安全的函数查询桌面原型

今天想和大家分享一个实用的小工具开发过程——用Python快速构建一个kernel32.dll API学习工具。作为一个Windows开发者&#xff0c;经常需要查阅kernel32.dll中的各种系统API&#xff0c;但直接从网上下载dll文件既不安全也不规范。于是我用InsCode(快马)平台快速生成了一个桌…...

终极指南:如何将电视盒子变身高性能Linux服务器

终极指南&#xff1a;如何将电视盒子变身高性能Linux服务器 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk3588, rk3568…...