玩轉Vue3之shallowRef和shallowReactive

来源:https://www.cnblogs.com/CodeForBetter/p/18071219
-Advertisement-
Play Games

前言 Vue3 作為一款現代的 JavaScript 框架,引入了許多新的特性和改進,其中包括 shallowRef 和 shallowReactive。這兩個功能在Vue 3中提供了更加靈活和高效的狀態管理選項,尤其適用於大型和複雜的應用程式。 Vue 3 的響應式系統 Vue3 引入了新的響應式 ...


前言

Vue3 作為一款現代的 JavaScript 框架,引入了許多新的特性和改進,其中包括 shallowRefshallowReactive。這兩個功能在Vue 3中提供了更加靈活和高效的狀態管理選項,尤其適用於大型和複雜的應用程式。

Vue 3 的響應式系統

Vue3 引入了新的響應式系統,與 Vue2相比,它具有更好的性能和更多的功能。這個新系統基於 Proxy,為開發者提供了更直觀、靈活的API,其中包括ref、reactive、shallowRef和shallowReactive等。之前的文章寫過有關響應式系統的解釋,在本博客中,我們將深入探討這兩個API,並提供一些具體的例子,以便更好地理解它們的用法和優勢。

1.shallowRef:淺層響應式引用

shallowRef 是一個創建響應式對象的函數,與 ref 不同之處在於,shallowRef 只會在對象的第一層進行響應式處理。這意味著當對象的深層屬性發生變化時,不會觸發視圖更新,從而提高了性能。
讓我們看一個例子:

import { shallowRef, watchEffect } from 'vue';

const user = shallowRef({
  name: 'John',
  address: {
    city: 'New York',
    zip: '10001'
  }
});

watchEffect(() => {
  console.log('User changed:', user.value);
});

// 修改深層屬性,不會觸發視圖更新
user.value.address.city = 'San Francisco';


在上面的例子中,watchEffect 只會在 name 屬性發生變化時觸發,而不會在 address 的變化時觸發。這有助於避免不必要的性能開銷,這對於一些場景非常有用,例如在處理大型數據集合時,可以提高性能並減少不必要的更新。

2.shallowReactive:淺層響應式對象

shallowRef 類似,shallowReactive 用於創建一個淺層響應式的對象。這意味著只有對象的第一層屬性會被響應化,這對於避免在深層次對象中進行遞歸響應式轉換非常有用。

import { shallowReactive, watchEffect } from 'vue';

const user = shallowReactive({
  name: 'John',
  address: {
    city: 'New York',
    zip: '10001'
  }
});

watchEffect(() => {
  console.log('User changed:', user);
});

// 修改深層屬性,不會觸發視圖更新
user.address.city = 'San Francisco';

在上述例子中,watchEffect 只在 name 屬性變化時觸發,而 address 屬性的變化不會引起更新。

使用場景

1. 性能優化

在處理大型數據集或嵌套對象時,使用 shallowRefshallowReactive 可以提高性能,避免不必要的響應式轉換和更新。

2. 避免無限迴圈

當你在數據模型中存在相互引用的情況時,使用 shallowRefshallowReactive 可以幫助你避免創建無限迴圈的響應式數據。

3. 更精確的控制

如果你只關心對象的第一層屬性,而不希望觸發深層次的更新,那麼 shallowRefshallowReactive 提供了更精確的控制。

結論

使用 shallowRefshallowReactive 的性能優勢在於避免了深層對象的遞歸偵聽,從而減少了觸發響應式系統的次數。這對於大型項目和數據結構來說是非常有用的。

通過瞭解它們的使用方式和性能優勢,我們可以更好地利用 Vue3 的響應式系統。始終記住,在使用這些特性時,要根據具體情況權衡性能和開發的便利性,確保你的代碼保持清晰、易讀和可維護。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • GreatSQL里也能用上RocksDB引擎 1. 前言 RocksDB 是基於Facebook 開源的一種支持事務的、高度可壓縮、高性能的MyRocks存儲引擎,特別適用於高度壓縮和大容量的數據。以下是一些關鍵特點: 高性能: LSM 樹結構使得RocksDB在寫入密集型負載下表現卓越。它能夠處理 ...
  • 原文: Android 桌面小組件使用-Stars-One的雜貨小窩 藉助公司上的幾個項目,算是學習了Android桌面小組件的用法,記下踩坑記錄 基本步驟 1.創建小組件佈局 這裡需要註意的事,小組件佈局里不能使用自定義View,只能使用原生的組件,比如說LinearLayout,TextView ...
  • XML 是一種用於存儲和傳輸數據的與軟體和硬體無關的工具。 什麼是XML? XML代表eXtensible Markup Language(可擴展標記語言)。XML是一種與HTML非常相似的標記語言。XML被設計用於存儲和傳輸數據。XML被設計成具有自我描述性。XML不執行任何操作,也許有點難理解, ...
  • HTML特性: 1.空白摺疊現象 1.文字間折為一個空格 <p>hello world!</p> 2.標簽內壁空白忽略 <p> hello world! </p> 2.轉義字元 <p>小於號&lt;</p> <p>大於號&gt;</p> <p>空格&nbsp;</p> <p>版權號&copy;</p ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、介紹 Generator 函數是 ES6 提供的一種非同步編程解決方案,語法行為與傳統函數完全不同 回顧下上文提到的解決非同步的手段: 回調函數 promise 那麼,上文我們提到promsie已經是一種比較流行的解決非同步方案,那麼為什麼 ...
  • 涉及的技術棧 vue3 vite bootstrap5 背景 在用bootstrap5的時候遇到一個問題,就是offcanvas在nav上的時候居然會有兩個背景BackDrop,關閉之後頁面上還有一個backdrop留在那 bootstrap5文檔裡面提供了幾個Method可以控制Offcanvas ...
  • 本文介紹三種使用純 CSS 實現星級評分的方式。每種都值得細品一番~ 五角星取自 Element Plus 的 svg 資源 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" style=""> <path fill="c ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 一、介紹 定義: 用於定義基本操作的自定義行為 本質: 修改的是程式預設形為,就形同於在編程語言層面上做修改,屬於元編程(meta programming) 元編程(Metaprogramming,又譯超編程,是指某類電腦程式的編寫,這 ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...