解密 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
英文地址,請注明出處:http://en.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個具有相同特性的數…