Vue3中的Ref與Reactive:深入理解響應式編程

来源:https://www.cnblogs.com/pglin/archive/2023/09/22/17722569.html
-Advertisement-
Play Games

前言 Vue 3是一個功能強大的前端框架,它引入了一些令人興奮的新特性,其中最引人註目的是ref和reactive。這兩個API是Vue 3中響應式編程的核心,本文將深入探討它們的用法和差異。 什麼是響應式編程? 在Vue中,響應式編程是一種使數據與UI保持同步的方式。當數據變化時,UI會自動更新, ...


前言

Vue 3是一個功能強大的前端框架,它引入了一些令人興奮的新特性,其中最引人註目的是refreactive。這兩個API是Vue 3中響應式編程的核心,本文將深入探討它們的用法和差異。

什麼是響應式編程?

在Vue中,響應式編程是一種使數據與UI保持同步的方式。當數據變化時,UI會自動更新,反之亦然。這種機制大大簡化了前端開發,使我們能夠專註於數據和用戶界面的交互,而不必手動處理DOM更新。

Ref

ref是Vue 3中的一個簡單響應式API,用於創建一個包裝基本數據類型的響應式引用(也可以包裝複雜類型,只不過底層還是由reactive的方式實現的)。它的主要優點是能夠輕鬆包裝基本數據類型,並且具有清晰的訪問和更新方式。

用法示例

import { ref } from 'vue';

const count = ref(0);

// 訪問數據
console.log(count.value); // 輸出 0

// 更新數據
count.value = 1;

在上面的示例中,我們首先導入了ref函數,然後使用它創建了一個名為count的響應式引用。我們可以像訪問普通變數一樣訪問它,並且當我們更新count時,相關的UI會自動更新。

優勢

  • 明確的數據訪問語法(.value)
  • 適用於包裝基本數據類型,如數字、字元串等。
  • 更容易閱讀和理解,適合處理簡單的響應式數據。

Reactive

ref不同,reactive是用於創建包裝對象的響應式引用。這意味著它可以用於創建響應式對象,而不僅僅是基本數據類型。它的主要優勢是在處理複雜數據結構時更加靈活,能夠包裝整個對象。

用法示例

import { reactive } from 'vue';

const user = reactive({
  name: 'John',
  age: 30,
});

// 訪問數據
console.log(user.name); // 輸出 'John'

// 更新數據
user.age = 31;

在這個示例中,我們使用reactive來創建了一個名為user的響應式對象。我們可以像訪問普通對象屬性一樣訪問和更新user的屬性,Vue會自動追蹤並處理數據變化。

優勢

  • 適用於包裝複雜的對象和數據結構,包括嵌套對象。
  • 不需要額外的語法(.value),直接訪問屬性。
  • 更適合處理多個相關屬性的情況,如表單欄位或組件狀態。

Ref與Reactive的區別

  1. 數據類型:ref用於包裝基本數據類型(如數字、字元串),而reactive用於包裝對象。
  2. 訪問數據:使用ref時,需要通過.value來訪問數據,而reactive則允許直接訪問屬性。
  3. 數據的包裝:ref返回一個包裝對象,而reactive返回一個包裝後的對象。

Vue 3響應式系統的原理

Vue 3的響應式系統建立在JavaScript的Proxy對象和Vue 2的Object.defineProperty之上,使其更加靈活和強大。vue官方文檔對響應式原理的解釋

Proxy是什麼?

Proxy 是JavaScript中的一個內置對象,它允許你創建一個代理對象,可以用來攔截對目標對象的各種操作,例如讀取、寫入、屬性檢索等。Proxy 對象通常用於實現元編程·,這意味著你可以控制、定製對象的行為。

以下是一些關於Proxy的基本概念和用法:

創建一個 Proxy 對象

要創建一個Proxy對象,你需要傳遞兩個參數:目標對象和一個處理器對象。處理器對象包含了一些方法,用於定義代理對象的行為。

const target = { name: 'John' };
const handler = {
  get(target, key) {
    console.log(`Getting ${key} property`);
    return target[key];
  },
  set(target, key, value) {
    console.log(`Setting ${key} property to ${value}`);
    target[key] = value;
  }
};

const proxy = new Proxy(target, handler);

攔截器方法

Proxy處理器對象中可以包含各種攔截器方法,用於控制不同操作。一些常見的攔截器方法包括:

  • get(target, key, receiver):攔截屬性的讀取操作。
  • set(target, key, value, receiver):攔截屬性的寫入操作。
  • has(target, key):攔截 in 運算符。
  • deleteProperty(target, key):攔截 delete 運算符。
    等等...(其他方法與之類似),這些攔截器方法允許你定義代理對象的行為,以滿足你的需求。

使用 Proxy 對象

一旦創建了Proxy對象,你可以像使用普通對象一樣使用它,但它會在後臺執行攔截器方法。

console.log(proxy.name); // 會觸發 get 攔截器,輸出 "Getting name property"
proxy.age = 30; // 會觸發 set 攔截器,輸出 "Setting age property to 30"

在上面的代碼中,我們創建了一個Proxy對象proxy,它會攔截對target對象的讀取和寫入操作。

應用示例

Proxy 對象的應用非常廣泛,它可以用於實現數據綁定、事件系統、攔截操作等等。在一些現代 JavaScript 框架和庫中,如 Vue 3 和 Vuex,Proxy被廣泛用於實現響應式系統,它能夠監聽對象的變化並自動觸發相應的更新操作。

ref的原理

ref的原理相對簡單。它使用Proxy對象來包裝基本數據類型,例如數字、字元串等。當你使用ref創建一個響應式引用時,實際上創建了一個Proxy對象,它會攔截對該引用的讀取和寫入操作。

例如,當你訪問count.value時,Proxy會捕獲這個操作,然後返回實際的值。當你更新count.value時,Proxy也會捕獲這個操作,並觸發相關的依賴更新,從而使相關的UI重新渲染。

reactive的原理

reactive的原理涉及更複雜的對象。它使用Proxy對象來包裝整個對象,而不僅僅是其中的屬性。這意味著你可以在一個對象上添加、刪除或修改屬性,並且這些操作都會被Proxy捕獲。

當你訪問或修改一個被reactive包裝的對象的屬性時,Proxy會捕獲這些操作,並自動追蹤依賴。這意味著當任何屬性發生變化時,Vue會知道哪些組件依賴於這些屬性,並且會自動更新這些組件以反映最新的數據。

響應式系統的實現

雖然上述是對Vue 3響應式系統的簡要解釋,但在Vue源碼。中,這一機制的實現要更複雜一些。Vue源碼中有大量的邏輯用於處理依賴追蹤、派發更新等操作,以確保數據和UI之間的同步。
如果你想深入研究Vue的源代碼,可以進一步瞭解它是如何實現的。

總結

Vue 3中的refreactive是響應式編程的核心工具,它們使數據與UI之間的同步變得輕鬆。根據您的需求,選擇適當的API來包裝您的數據,以獲得最佳的開發體驗。ref適用於基本數據類型,而reactive適用於對象,通過靈活使用這兩者,您可以更輕鬆地構建出動態的Vue 3應用程式。
希望本文對你有所幫助,深入理解refreactive將為你在Vue 3中的響應式編程提供堅實的基礎。繼續探索Vue 3的強大功能,創造出令人印象深刻的Web應用程式吧!


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

-Advertisement-
Play Games
更多相關文章
  • 習慣了 linux 命令的快捷操作,使用 winodws 的 shell 感覺效率非常低下,於是開始搜尋工具支持。 剛開始搜到的是 GnuWin32,但是它已經停止更新維護了,於是找到了 Cygwin。當然 Cygwin 還有其他功能,在此不做贅述 下載安裝 1. 登錄 Cygwin官網下載界面,進 ...
  • 1、首先你需要提前準備好jar包或者war包,並想辦法放入Linux環境(或虛擬機)中; 2、java項目的部署需要用到Tomcat或者Jetty,docker可以直接拉取他倆的鏡像,這裡以Tomcat為例: # : 後面需要加上war或者jar對應的Tomcat版本,最好加上, # 否則預設最新的 ...
  • 一、文檔的查看指令 1、tail指令 作用:查看一個文件的末n行 語法:#tail -n 文件的路徑 說明:-n可以不寫,不寫,預設表示10行。 案例:新建一個1.txt文檔,使用tail指令查看root/1.txt文件的末5行和末10行 tail -5 /root/1.txt tail /root ...
  • 1. 線上備份 2. 離線備份 2.1. 關閉MySQL做備份是最簡單、最安全的 2.2. 所有獲取一致性副本的方法中最好的 2.3. 損壞或不一致的風險最小 2.4. 根本不用關心InnoDB緩衝池中的臟頁或其他緩存 2.5. 不需要擔心數據在嘗試備份的過程中被修改 2.5.1. 伺服器不對應用提 ...
  • MySQL 主從複製與讀寫分離 1、什麼是讀寫分離? 讀寫分離,基本的原理是讓主資料庫處理事務性增、改、刪操作(INSERT、UPDATE、DELETE),而從資料庫處理SELECT查詢操作。資料庫複製被用來把事務性操作導致的變更同步到集群中的從資料庫。 2、為什麼要讀寫分離呢? 因為資料庫的“寫” ...
  • 最近,某白酒品牌頻頻吸引大眾眼球,白酒與咖啡、巧克力等聯名衍生品一經推出便掀起熱潮。某商品由於太過火爆,甚至一度售罄下架。 不得不說,我國擁有超大規模內需市場,消費潛力巨大。 當前,創新消費場景加上數字化融合轉型,成為酒企品牌開疆擴土、逆勢增長的重要途徑。 如今越來越多的酒企開始擁抱數字化,建立涵蓋 ...
  • 1. 每個人都知道需要備份,但並不是每個人都能意識到需要的是可恢復的備份 1.1. 如果你沒有提前做好備份規劃,也許以後會發現已經錯失了一些最佳的選擇 1.2. 在伺服器已經配置好以後,才想起應該使用LVM,以便獲取文件系統的快照——但這時已經太遲了 1.3. 如果你沒有計劃做定期的恢復演練,當真的 ...
  • 在日常開發中,很多時候需要對數組進行分組,每次都要手寫一個分組函數,或者使用lodash的groupBy函數。好消息是,JavaScript 現在正在引入全新的分組方法:Object.groupBy和Map.groupBy,以後再也不需要手寫分組函數了,目前最新版本的 Chrome(117)已經支持 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...