Vue3 中 ref 與 reactive 的區別及底層原理詳解

一、核心區別

1. 數據類型與使用場景

? ref

 可定義基本類型(字符串、數字、布爾值)和對象類型的響應式數據。對于對象類型,`ref` 內部會自動調用 `reactive` 將其轉換為響應式對象。  語法特點:需通過 `.value` 訪問或修改數據(模板中自動解包,無需 `.value`)。  適用場景:簡單數據、需跨組件傳遞的獨立變量、需要重新賦值的場景(如替換整個對象)。  

? reactive

 僅支持對象類型(對象、數組、Map/Set 等),通過 `Proxy` 實現深度響應式代理。  語法特點:直接訪問屬性(如 `state.count`),無需 `.value`,但無法直接替換整個對象(需用 `Object.assign` 合并更新)。  適用場景:復雜嵌套對象、需深度響應式追蹤的復雜數據結構。  
2. 響應式機制差異
ref 底層原理
 通過封裝對象的 `.value` 屬性實現響應式:  ? 對基本類型使用 `Object.defineProperty` 的 `get/set` 進行數據劫持。  ? 對對象類型內部調用 `reactive` 轉換為 `Proxy` 代理。  ```javascript// 簡化的 ref 實現邏輯function ref(value) {return {get value() { track(this, 'value'); return value; },set value(newVal) { value = newVal; trigger(this, 'value'); }};}```
reactive 底層原理
 基于 `Proxy` 攔截對象屬性的增刪改查,結合 `Reflect` 操作原始數據:  ```javascript// 簡化的 reactive 實現邏輯function reactive(obj) {return new Proxy(obj, {get(target, key) { track(target, key); return Reflect.get(target, key); },set(target, key, value) { Reflect.set(target, key, value); trigger(target, key); return true;}});}```所有嵌套屬性均會被遞歸代理,實現深層響應性。

二、關鍵特性對比

特性refreactive
數據類型基本類型 + 對象類型僅對象類型
訪問方式.value(模板自動解包)直接訪問屬性(如 state.key
重新賦值支持(通過 .value =需合并更新(如 Object.assign
解構響應性解構后仍需 .value解構會丟失響應性,需 toRefs
性能基本類型更輕量復雜對象更高效(Proxy 深度監聽)

三、設計理念與使用建議

1. 設計哲學

? ref 提供單一值響應式的原子化封裝,適合組件間傳遞獨立狀態。

? reactive 針對復雜狀態樹設計,通過 Proxy 實現細粒度依賴追蹤,優化深層更新性能。

2. 使用建議

? 優先 ref 的場景:

 ? 簡單數據(如計數器、表單字段)。  ? 需要頻繁替換整個對象(如接口返回數據更新)。  

? 優先 reactive 的場景:

 ? 復雜配置對象(如含多層嵌套的表單數據)。  ? 需要自動追蹤屬性增刪的場景(如動態表單字段)。  
3. 注意事項

? reactive 直接替換整個對象會丟失響應性,需用 Object.assign 合并更新。

? 模板中 ref 對象自動解包,但 JavaScript 中必須使用 .value

? 使用 toRefs 解構 reactive 對象可保持響應性。


四、總結

refreactive 是 Vue3 響應式系統的兩大核心 API:
? ref 通過 .value 封裝簡化基本類型響應式,兼顧對象類型的靈活性。

? reactive 利用 Proxy 實現深度監聽,適合復雜狀態管理。

開發者應根據數據類型、更新頻率及使用場景選擇最合適的 API,必要時結合 toRefs 優化代碼結構。


異步輸出

async await后面的任務是會加入微任務隊列,本身是同步函數的話直接就console.log()


this指向輸出

const定義變量時不會被掛載到window上

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/80303.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80303.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/80303.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AGV導航控制器技術方案——基于EFISH-SBC-RK3576/SAIL-RK3576的國產化革新?(新一代工業級自主可控解決方案)?

一、方案核心架構 ?1. 硬件拓撲設計? ?主控單元?:SAIL-RK3576核心板(八核A72A53M0異構架構)?傳感器層?: 雙激光雷達(RS-LiDAR-16線 SICK TIM240)9軸IMU(BMI088) 輪式編碼器&…

AI 輔助生成原型圖

AI 輔助生成原型圖 一、HTML 轉設計稿工具介紹 網頁轉設計稿工具 使用 MasterGo 的 html-to-mastergo 插件可將網頁轉為設計稿,支持: 任意在線 HTML 文件(通過將 AI 生成的 UI 發布為在線頁,可通過 Vercel 實現)離…

從零打造個人博客靜態頁面與TodoList應用:前端開發實戰指南

前言 在當今數字時代,擁有個人博客和高效的任務管理工具已成為開發者展示自我和提升生產力的標配。本文將帶你從零開始,通過純前端技術實現一個兼具個人博客靜態頁面和TodoList任務管理功能的綜合應用。無論你是前端新手還是希望鞏固基礎的中級開發者&a…

工作流與n8n:自動化技術的演進與開源工具的核心地位

第一章 工作流的基礎理論介紹 1.1 工作流的定義與核心要素 工作流(Workflow)是指一系列相互銜接、自動化的業務活動或任務,其核心在于通過規則驅動的流程設計,實現跨系統、跨角色的協同作業。根據國際工作流管理聯盟&#xff08…

WordPress插件:WPJAM Basic優化設置

WPJAM Basic 插件的「優化設置」是我愛水煮魚博客多年使用 WordPress 的經驗而整理的各類優化設置。 一、功能屏蔽 功能屏蔽就是屏蔽一些WordPress中用不上、難用的功能,目前的支持屏蔽以下功能: (1)屏蔽文章修訂功能 文章修…

Spring AI 入門(持續更新)

介紹 Spring AI 是 Spring 項目中一個面向 AI 應用的模塊&#xff0c;旨在通過集成開源框架、提供標準化的工具和便捷的開發體驗&#xff0c;加速 AI 應用程序的構建和部署。 依賴 <!-- 基于 WebFlux 的響應式 SSE 傳輸 --> <dependency><groupId>org.spr…

c/c++日志庫初識

C/C日志庫&#xff1a;從入門到實踐的深度指南 在軟件開發的世界里&#xff0c;日志&#xff08;Logging&#xff09;扮演著一個沉默卻至關重要的角色。它像是飛行記錄儀的“黑匣子”&#xff0c;記錄著應用程序運行時的關鍵信息&#xff0c;幫助開發者在問題發生時追溯根源&a…

C 語言圖形編程 | 界面 / 動畫 / 字符特效

注&#xff1a;本文為 “C 語言圖形編程” 相關文章合輯。 略作重排&#xff0c;如有內容異常&#xff0c;請看原文。 C 語言圖形化界面——含圖形、按鈕、鼠標、進度條等部件制作&#xff08;帶詳細代碼、講解及注釋&#xff09; 非線性光學元件于 2020-02-15 09:42:37 發布…

開發狂飆VS穩定剎車:Utility Tree如何讓架構決策“快而不失控”

大家好&#xff0c;我是沛哥兒。 在軟件技術架構的世界里&#xff0c;架構師們常常面臨靈魂拷問&#xff1a;高并發和低成本哪個優先級更高&#xff1f; 功能迭代速度和系統穩定性該如何平衡&#xff1f; 當多個質量屬性相互沖突時&#xff0c;該如何做出科學決策&#xff1f; …

SCI論文圖數據提取軟件——GetData Graph Digitizer

在寫綜述或者畢業論文的時候一般會引用前人的文獻數據圖&#xff0c;但是直接截圖獲取來的數據圖通常質量都不太高。因此我們需要從新畫一張圖&#xff0c;可以通過origin繪圖來實現&#xff0c;今天介紹一個新的軟件GetData Graph Digitizer 感謝下面博主分享的破解安裝教程 …

深入探索 Apache Spark:從初識到集群運行原理

深入探索 Apache Spark&#xff1a;從初識到集群運行原理 在當今大數據時代&#xff0c;數據如同奔涌的河流&#xff0c;蘊藏著巨大的價值。如何高效地處理和分析這些海量數據&#xff0c;成為各行各業關注的焦點。Apache Spark 正是為此而生的強大引擎&#xff0c;它以其卓越…

場景可視化與數據編輯器:構建數據應用情境?

場景可視化是將數據與特定的應用場景相結合&#xff0c;借助數據編輯器對數據進行靈活處理和調整&#xff0c;通過模擬和展示真實場景&#xff0c;使企業能夠更直觀地理解數據在實際業務中的應用和影響&#xff0c;為企業的決策和運營提供有力支持。它能夠將抽象的數據轉化為具…

攻防世界-php偽協議和文件包含

fileinclude 可以看到正常回顯里面顯示lan參數有cookie值表示為language 然后進行一個判斷&#xff0c;如果參數不是等于英語&#xff0c;就加上.php&#xff0c;那我們就可以在前面進行注入一個參數&#xff0c;即flag&#xff0c; payload&#xff1a;COOKIE:languageflag …

手撕LFU

博主介紹&#xff1a;程序喵大人 35- 資深C/C/Rust/Android/iOS客戶端開發10年大廠工作經驗嵌入式/人工智能/自動駕駛/音視頻/游戲開發入門級選手《C20高級編程》《C23高級編程》等多本書籍著譯者更多原創精品文章&#xff0c;首發gzh&#xff0c;見文末&#x1f447;&#x1f…

火影bug,未保證短時間數據一致性,拿這個例子講一下Redis

本文只拿這個游戲的bug來舉例Redis&#xff0c;如果有不妥的地方&#xff0c;聯系我進行刪除 描述&#xff1a;今天在高速上打火影&#xff08;有隧道&#xff0c;有時候會卡&#xff09;&#xff0c;發現了個bug&#xff0c;我點了兩次-1000的忍玉&#xff08;大概用了1千七百…

KRaft (Kafka 4.0) 集群配置指南(超簡單,脫離 ZooKeeper 集群)還包含了簡化測試指令的腳本!!!

docker-compose方式部署kafka集群 Kafka 4.0 引入了 KRaft 模式&#xff08;Kafka Raft Metadata Mode&#xff09;&#xff0c;它使 Kafka 集群不再依賴 ZooKeeper 進行元數據管理。KRaft 模式簡化了 Kafka 部署和管理&#xff0c;不需要額外配置 ZooKeeper 服務&#xff0c;…

Admyral - 可擴展的GRC工程自動化平臺

文章目錄 一、關于 Admyral相關鏈接資源關鍵特性 二、安裝系統要求 三、快速開始1、啟動服務 四、核心功能1、自動化即代碼2、AI增強工作流3、雙向同步編輯器4、工作流監控5、企業級基礎設施 五、示例應用六、其他信息許可證遙測說明 一、關于 Admyral Admyral 是一個基于 Pyt…

DDR在PCB布局布線時的注意事項及設計要點

一、布局注意事項 控制器與DDR顆粒的布局 靠近原則&#xff1a;控制器與DDR顆粒應盡量靠近&#xff0c;縮短時鐘&#xff08;CLK&#xff09;、地址/控制線&#xff08;CA&#xff09;、數據線&#xff08;DQ/DQS&#xff09;的走線長度&#xff0c;減少信號延遲差異。 分組隔…

計算機網絡-LDP工作過程詳解

前面我們已經學習了LDP的基礎概念&#xff0c;了解了LDP會話的建立、LDP的標簽控制等知識&#xff0c;今天來整體過一遍LDP的一個工作過程&#xff0c;后面我們再通過實驗深入學習。 一、LDP標簽分發 標簽分發需要基于基礎的路由協議建立LDP會話&#xff0c;激活MPLS和LDP。以…

解構與重構:自動化測試框架的進階認知之旅

目錄 一、自動化測試的介紹 &#xff08;一&#xff09;自動化測試的起源與發展 &#xff08;二&#xff09;自動化測試的定義與目標 &#xff08;三&#xff09;自動化測試的適用場景 二、什么是自動化測試框架 &#xff08;一&#xff09;自動化測試框架的定義 &#x…