解密 Vue 3 shallowRef:浅层响应式 vs 深度响应式的性能对决

📖 概述

shallowRef() 是 Vue 3 中的一个组合式 API 函数,用于创建浅层响应式引用。与 ref() 不同,shallowRef() 只在其 .value 被直接替换时触发响应式更新,不会深度监听对象内部属性的变化。

🎯 基本概念

什么是 shallowRef?

shallowRef() 创建一个响应式引用,但只在其值被完全替换时触发更新,不会深度监听对象或数组内部的变化。这提供了更好的性能,特别适用于大型对象或不需要深度响应式的场景。

使用场景

  • 🚀 性能优化:处理大型对象或数组
  • 🎮 游戏开发:频繁更新的状态管理
  • 📊 数据可视化:大量数据的响应式处理
  • 🔧 第三方库集成:避免深度响应式监听

🔧 函数签名

function shallowRef<T>(value: T): ShallowRef<T>;interface ShallowRef<T> {value: T;
}

💻 代码示例

🚀 基础用法

<script setup lang="ts">
import { shallowRef, ref } from "vue";// 创建浅层响应式引用
const shallowData = shallowRef({ count: 0, name: "Vue" });
const deepData = ref({ count: 0, name: "Vue" });// 直接替换值会触发更新
shallowData.value = { count: 1, name: "Vue3" };// 修改内部属性不会触发更新
shallowData.value.count = 2; // ❌ 不会触发响应式更新// 而 ref 会深度监听
deepData.value.count = 2; // ✅ 会触发响应式更新
</script>

📊 大数据处理

<script setup lang="ts">
import { shallowRef, onMounted } from "vue";// 大型数据集
const largeDataset = shallowRef([]);onMounted(async () => {// 模拟获取大量数据const data = await fetchLargeDataset();largeDataset.value = data; // ✅ 一次性更新,性能更好
});// 批量更新数据
const updateDataset = (newData: any[]) => {largeDataset.value = newData; // ✅ 触发更新
};
</script>

⚖️ 与 ref 的对比

🔍 深度响应式(ref)

<script setup lang="ts">
import { ref } from "vue";const user = ref({ name: "Alice", age: 25 });// 修改内部属性会触发更新
user.value.age = 26; // ✅ 触发响应式更新
user.value.name = "Bob"; // ✅ 触发响应式更新
</script>

🎯 浅层响应式(shallowRef)

<script setup lang="ts">
import { shallowRef } from "vue";const user = shallowRef({ name: "Alice", age: 25 });// 修改内部属性不会触发更新
user.value.age = 26; // ❌ 不会触发响应式更新
user.value.name = "Bob"; // ❌ 不会触发响应式更新// 只有完全替换对象才会触发更新
user.value = { name: "Bob", age: 26 }; // ✅ 触发响应式更新
</script>

⚠️ 注意事项

🔄 触发更新的方式

shallowRef 只在以下情况触发响应式更新:

<script setup lang="ts">
import { shallowRef } from "vue";const data = shallowRef({ count: 0 });// ✅ 会触发更新
data.value = { count: 1 };// ❌ 不会触发更新
data.value.count = 1;
data.value.nested = { value: 1 };
</script>

🎯 与 reactive 的区别

shallowRef 和 shallowReactive 的区别:

<script setup lang="ts">
import { shallowRef, shallowReactive } from "vue";// shallowRef - 需要 .value 访问
const refData = shallowRef({ count: 0 });
console.log(refData.value.count);// shallowReactive - 直接访问
const reactiveData = shallowReactive({ count: 0 });
console.log(reactiveData.count);
</script>

🔧 手动触发更新

如果需要手动触发更新,可以使用 triggerRef

<script setup lang="ts">
import { shallowRef, triggerRef } from "vue";const data = shallowRef({ count: 0 });// 修改内部属性
data.value.count = 1;// 手动触发更新
triggerRef(data); // ✅ 强制触发响应式更新
</script>

🎯 最佳实践

1️⃣ 性能优化场景

在需要处理大型对象或频繁更新的场景中使用:

<script setup lang="ts">
import { shallowRef, computed } from "vue";// 大型配置对象
const config = shallowRef({theme: "dark",language: "zh-CN",settings: {/* 大量配置项 */},
});// 只在配置完全替换时更新
const updateConfig = (newConfig: typeof config.value) => {config.value = newConfig;
};
</script>

2️⃣ 避免不必要的深度监听

当不需要监听对象内部变化时使用:

<script setup lang="ts">
import { shallowRef } from "vue";// 只关心整体替换,不关心内部变化
const userProfile = shallowRef({id: 1,name: "Alice",preferences: { theme: "dark", notifications: true },
});// 更新整个用户资料
const updateProfile = (profile: typeof userProfile.value) => {userProfile.value = profile;
};
</script>

3️⃣ 结合 triggerRef 使用

在需要精确控制更新时机时:

<script setup lang="ts">
import { shallowRef, triggerRef } from "vue";const formData = shallowRef({name: "",email: "",message: "",
});// 批量更新后手动触发
const updateForm = (updates: Partial<typeof formData.value>) => {Object.assign(formData.value, updates);triggerRef(formData); // 手动触发更新
};
</script>

❓ 常见问题

Q: 什么时候使用 shallowRef 而不是 ref?

A: 当处理大型对象、频繁更新的数据,或不需要深度响应式监听时使用 shallowRef。

Q: shallowRef 会影响计算属性吗?

A: 计算属性会正常响应 shallowRef 的变化,但不会响应其内部属性的变化。

Q: 如何强制 shallowRef 更新?

A: 使用 triggerRef() 函数可以强制触发 shallowRef 的响应式更新。

📝 总结

shallowRef() 是 Vue 3 中用于性能优化的强大工具,特别适用于处理大型对象、频繁更新的状态,以及不需要深度响应式监听的场景。通过合理使用 shallowRef(),可以显著提升应用性能,同时保持必要的响应式能力。记住,只有在完全替换值时才会触发更新,如需手动控制更新时机,可以使用 triggerRef()

 解密 Vue 3 shallowRef:浅层响应式 vs 深度响应式的性能对决 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿技术分享

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

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

相关文章

Linux进程间通信(IPC)深入解析

Linux进程间通信&#xff08;IPC&#xff09;深入解析 1 概述 Linux 进程间通信 (Inter-Process Communication, IPC) 是不同进程之间交换数据与同步操作的机制。现代 Linux 内核提供了多种 IPC 方式&#xff0c;从传统的管道和 System V IPC 到现代的套接字和 D-Bus&#xff0…

TensorFlow-GPU版本安装

前言&#xff1a; &#xff08;1&#xff09;因项目需求&#xff0c;需要安装TensorFlow-GPU版本&#xff0c;故本文在此记录安装过程。 &#xff08;2&#xff09;有注释&#xff0c;优先看注释 &#xff08;3&#xff09;本文所使用的GPU为NVIDIA GeForce RTX 5080 Laptop GP…

Elasticsearch 索引字段删除,除了 Reindex 重建索引还有没有别的解决方案?

unsetunset1、问题来源unsetunset在生产环境维护 Elasticsearch 集群的过程中&#xff0c;经常会遇到这样的场景&#xff1a;业务需求变更导致某些字段不再使用&#xff0c;或者早期设计时添加了一些冗余字段&#xff0c;现在需要清理掉。最近球友在公司的一个项目中就遇到了这…

Ubuntu虚拟机磁盘空间扩展指南

这是一份详细且易于理解的 Ubuntu 虚拟机磁盘空间扩展指南。本指南涵盖了两种主流虚拟机软件&#xff08;VirtualBox 和 VMware&#xff09;的操作步骤&#xff0c;并分为 “扩展虚拟磁盘” 和 “在 Ubuntu 内部分配新空间” 两大部分。重要提示&#xff1a;在进行任何磁盘操作…

教程1:用vscode->ptvsd-创建和调试一个UI(python)-转载官方翻译(有修正)

vscode用python开发maya联动调试设置 3dsMax Python开发环境搭建 3文联动之debugpy调试max‘python. 3文联动之socket插槽注入max‘python 本教程是max主动接收创建代码的方式&#xff08;预先运行界面&#xff0c;通过按钮主动读取py脚本&#xff0c;执行断点&#xff09;&…

龙迅#LT7621GX适用于两路HDMI2.1/DP1.4A转HDMI2.1混切应用,分辨率高达8K60HZ!

1. 描述LT7621GX是一款高性能两路HDMI2.1/DP1.4转HDMI2.1混合开关芯片&#xff0c;用于显示应用。 HDCP RX作为HDCP中继器的上游&#xff0c;可以与其他芯片的HDCP TX配合&#xff0c;实现中继器功能。 对于HDMI2.1输入&#xff0c;LT7621GX可以配置为3/4通道。自适应均衡使其适…

【Ruoyi 解密 - 12. JDK17的新特性】------ 从Java 8 到 Java 17:向Scala看齐的“简洁革命”,同宗JVM下的效率狂飙

从Java 8到Java 17&#xff1a;抄作业Scala&#xff1f;JVM同宗下的Ruoyi开发效率狂飙&#xff01; 上一篇我们聊到JDK 17对Python的柔性借鉴&#xff0c;可深入用下来才发现——这哪够&#xff01;对Ruoyi开发者来说&#xff0c;JDK 17真正的“王炸”&#xff0c;是把同根JVM的…

大模型 “轻量化” 之战:从千亿参数到端侧部署,AI 如何走进消费电子?

一、大模型 “轻量化” 的行业背景在 AI 技术蓬勃发展的当下&#xff0c;大模型已然成为行业焦点。从 GPT-4 突破万亿级参数量&#xff0c;到 DeepSeek-R1 迈向千亿参数规模&#xff0c;大模型的参数扩张趋势显著。然而&#xff0c;这种规模的增长也带来了诸多挑战。以 GPT-4 为…

香港电讯与Microsoft香港推出新世代“Teams Phone” 解决方案

香港电讯成为香港首家提供 “Microsoft Operator Connect”的本地电讯营运商1 香港电讯&#xff08;股份代号&#xff1a;6823&#xff09;【香港 • 2025年2月11日】 – 香港电讯宣布与 Microsoft 香港合作推出 “Operator Connect”&#xff0c;成为全港首家为企业客户提供全…

PlantUML描述《分析模式》第3章观察和测量(2)

lantUML描述《分析模式》第2章“当责”&#xff08;1&#xff09; PlantUML描述《分析模式》第2章“当责”&#xff08;2&#xff09; PlantUML描述《分析模式》第3章观察和测量&#xff08;1&#xff09; 原图3.8 EA绘制 图3.8 递归关系用于记录证据和评估。 PlantUML sta…

轮廓周长,面积,外界圆,外界矩形近似轮廓和模板匹配和argparse模块实现代码参数的动态配置

目录 一.轮廓操作 1.轮廓特征的引入与筛选 2.轮廓排序和精准定位 3.外接圆与外接矩形的计算与绘制 二.轮廓近似 1.轮廓近似的基本概念 2.轮廓近似的实现方法和核心步骤 3. 近似精度参数的设定逻辑 4.轮廓定位方法 三.模板匹配 1.模板匹配技术原理与实现流程 2.技术要…

【第三方网站测评:会话管理漏洞的测试与加固】

会话管理是Web应用安全的用于在无状态的HTTP协议上维持用户状态。漏洞主要源于会话令牌(Session Token)的生成、传输、验证和销毁过程中的缺陷。攻击者利用这些缺陷可劫持用户会话,未经授权访问敏感数据或执行特权操作,属于OWASP TOP 10中身份验证失效的高频风险。 会话管…

理想汽车智驾方案介绍专题 3 MoE+Sparse Attention 高效结构解析

一、前言 【理想汽车智驾方案介绍专题 -1】端到端VLM 方案介绍 【理想汽车智驾方案介绍专题 -2】MindVLA 方案详解 在上述两篇系列帖子中&#xff0c;笔者已对理想汽车 VLM 和 VLA 方案的框架进行了全面介绍&#xff0c;但对于其中的前沿技术仅做了初步探讨&#xff0c;未进…

如何将yolo训练图像数据库的某个分类的图像取出来

COCO 数据集 - Ultralytics YOLO 文档 比如我只想从数据集中取手机的图像&#xff0c;来用于我的训练&#xff0c;懒得自己一张一张标注&#xff0c;方法如下 # -*- coding: utf-8 -*- import json import os import shutil from pathlib import Path from tqdm import tqdm i…

【WPF】WPF 自定义控件实战:从零打造一个可复用的 StatusIconTextButton (含避坑指南)

&#x1f527; WPF 自定义控件实战&#xff1a;从零打造一个可复用的 StatusIconTextButton&#xff08;含避坑指南&#xff09;发布于&#xff1a;2025年8月29日 标签&#xff1a;WPF、C#、自定义控件、MVVM、Generic.xaml、属性绑定、TemplateBinding&#x1f4cc; 引言 在 W…

中国国际商会副秘书长徐梁一行到访国联股份

2025年08月27日&#xff0c;中国国际商会副秘书长徐梁等一行到访国联股份&#xff0c;国联股份创始人、CEO/总裁钱晓钧&#xff0c;国联股份副总裁、卫多多/纸多多CEO黄莎莎等热情招待来访一行&#xff0c;并展开深入交流。来访一行首先参观了国联股份数字经济展厅&#xff0c;…

换公司如何快速切入软件项目工程

一、前言 作为程序员&#xff0c;根据自身职业发展&#xff0c;会通过跳槽谋求更进一步的发展&#xff0c;这时进入新公司&#xff0c;接触全新的项目工程和业务&#xff0c;如何快速的切入&#xff0c;形成认识呢&#xff1f;就算不跳槽&#xff0c;公司业务调整&#xff0c;也…

Linux系统——EXT2 文件系统

磁盘文件 文件属性 文件内容文件内容 —— 数据块&#xff0c;文件属性 —— inodeLinux 文件在磁盘中的存储&#xff0c;是将 属性 与 内容 分开存储的内存&#xff1a;掉电易失&#xff0c;磁盘&#xff1a;永久性存储介质图片来自百度磁盘访问的基本单元&#xff1a;扇区 …

Qt中的锁(1)

Qt中的锁&#xff08;1&#xff09; 加锁&#xff0c;把多个要访问的公共资源通过锁保护起来&#xff0c;把并行执行变成串行执行&#xff0c; 多个线程执行加锁的对象得是同一个对象&#xff0c;不同对象不会互斥 代码&#xff1a;//添加一个static成员static int num;//创建锁…

数据结构 02(线性:顺序表)

目录 线性表 顺序表 概念与结构 动态顺序表的实现 头文件的创建 顺序表初始化 顺序表的扩容 尾插功能 头插功能 尾删功能 头删功能 查找功能 任意位置前插入 任意位置前删除 销毁 动态顺序表整体呈现 SeqList.h SeqList.c 线性表 线性表是n个具有相同特性的数…