vue中ref()和reactive()區別

好的,這是 Vue 3 中 ref()reactive() 這兩個核心響應式 API 之間區別的詳細解釋。

簡單來說,它們是創建響應式數據的兩種方式,主要區別在于處理的數據類型訪問數據的方式

核心區別速查表

特性ref()reactive()
適用類型? 任何類型 (字符串、數字、布爾、對象、數組等)? 僅限對象類型 (Object, Array, Map, Set)
訪問/修改在 JS 中必須通過 .value 屬性在 JS 中直接訪問,像普通對象一樣
模板中使用不需要 .value,Vue 會自動解包直接訪問,像普通對象一樣
重新賦值? 可以對整個 .value 重新賦值? 不能直接對整個變量重新賦值,會破壞響應性
底層原理通過一個包含 value 屬性的對象來實現包裝使用 ES6 的 Proxy 實現對整個對象的劫持

ref():更靈活的“盒子”

ref() 的設計初衷是為了處理原始數據類型(Primitive Types),如字符串、數字、布爾值。當然,它也可以用來包裝對象。

你可以把 ref() 想象成一個萬能的、響應式的“盒子”。無論你放什么進去,它都會把它裝進一個特殊的盒子里。要訪問或修改里面的東西,你需要打開這個盒子,也就是訪問它的 .value 屬性。

ref() 的關鍵點:
  1. 接受任何值ref('some string'), ref(123), ref(true), ref({ name: '張三' }) 都可以。
  2. JS 中必須用 .value:在 <script setup>setup() 函數中,訪問和修改 ref 創建的變量時,必須通過 .value
  3. 模板中自動解包:在 <template> 中使用時,Vue 非常智能,會自動“打開盒子”,所以你不需要.value
ref() 示例代碼:
<template><div><p>計數: {{ count }}</p><button @click="increment">增加</button><p>用戶信息: {{ user.name }}</p></div>
</template><script setup>
import { ref } from 'vue';// 1. 用于原始類型
const count = ref(0);// 2. 在 JS/TS 中,必須通過 .value 來訪問和修改
function increment() {count.value++;
}// 3. 也可以用于對象,但同樣需要 .value
const user = ref({ name: '張三' });
console.log(user.value.name); // 輸出: 張三
</script>

reactive():對象的“代理”

reactive() 專門用于將對象類型(包括普通對象、數組、Map、Set)的數據轉換成響應式數據。

它不做任何包裝,而是直接返回一個原始對象的“代理” (Proxy)。你對這個代理對象的所有操作(讀取、修改、添加、刪除屬性)都會被 Vue 攔截,從而觸發視圖更新。

reactive() 的關鍵點:
  1. 只能用于對象reactive({ ... }), reactive([ ... ]) 可以,但 reactive(123) 會報錯
  2. 直接訪問:使用起來和普通 JS 對象一模一樣,不需要 .value
  3. 不能重新賦值:這是一個非常重要的陷阱!你不能直接用一個新的對象替換整個 reactive 變量,否則會失去響應性,因為這切斷了原始代理對象的連接。
reactive() 示例代碼:
<template><div><p>用戶信息: {{ state.user.name }} - {{ state.user.age }} 歲</p><p>他的愛好: {{ state.hobbies.join('、') }}</p><button @click="updateUser">更新用戶信息</button></div>
</template><script setup>
import { reactive } from 'vue';// 1. 只能用于對象或數組
const state = reactive({user: {name: '李四',age: 30},hobbies: ['編程', '音樂']
});function updateUser() {// 2. 直接修改屬性,像普通對象一樣state.user.age++;state.hobbies.push('運動');// ? 錯誤做法:直接替換整個對象會導致響應性丟失!// state = { user: { name: '王五', age: 40 }, hobbies: [] }; // ? 正確做法:逐個屬性賦值或使用 Object.assign// Object.assign(state, { user: { name: '王五', age: 40 }, hobbies: [] });
}
</script>

總結與使用建議

  1. 優先使用 ref()

    • 當你需要處理原始數據類型(字符串、數字、布爾值)時,必須使用 ref()
    • 當你不確定數據類型時,ref() 是更安全、更通用的選擇。
    • 社區中有一種流行的風格是“始終使用 ref()”,以保持代碼風格的一致性。因為 ref() 既能處理原始類型,也能處理對象。
  2. 在特定場景下使用 reactive()

    • 當你明確知道你需要一個復雜的、多層級的響應式對象或數組時,使用 reactive() 可以讓代碼更簡潔,因為你不需要到處寫 .value。例如,管理一個復雜的表單狀態。

一個簡單的記憶法則

  • ref -> 凡事用它準沒錯,就是記得在 JS 里加 .value
  • reactive -> 專為對象服務,用法自然,但小心別整個替換掉它。

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

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

相關文章

目標檢測數據集——交通信號燈紅綠燈檢測數據集

在智能交通系統迅速發展的背景下&#xff0c;準確且實時地識別交通信號燈的狀態對于提升道路安全和優化交通流量管理至關重要。 無論是自動駕駛汽車還是輔助駕駛技術&#xff0c;可靠地檢測并理解交通信號燈的指示——特別是紅燈與綠燈的區別——是確保交通安全、避免交通事故…

哪款即時通訊服務穩定性靠譜?18家對比

本文將深入對比18家 IM 服務商&#xff1a;1.網易云信; 2. 有度即時通; 3. 環信; 4. 小天互連; 5. 企達即時通訊; 6. 敏信即時通訊; 7. 360織語; 8. 容聯云通訊; 9. 云之訊 UCPaaS等。 在如今的數字化時代&#xff0c;即時通訊&#xff08;IM&#xff09;軟件已經成為企業日常運…

【Android】Flow學習及使用

目錄 前言基礎基本用法概念與核心特點Android中使用與LiveData對比熱流StateFlow、SharedFlow 搜索輸入流實現實時搜索 前言 ? Flow是kotlin協程庫中的一個重要組成部分&#xff0c;它可以按順序發送多個值&#xff0c;用于對異步數據流進行處理。所謂異步數據流就是連續的異…

idea常做的配置改動和常用插件

IDEA 使用 最強教程&#xff0c;不多不雜。基于idea旗艦版 2019.2.3左右的版本&#xff0c;大多數是windows的&#xff0c;少數是mac版的 一、必改配置 1、ctrl滾輪 調整字體大小 全局立即生效&#xff1a;settings -> Editor -> General -> Change font size with …

3. 物理信息神經網絡(PINNs)和偏微分方程(PDE),用物理定律約束神經網絡

導言&#xff1a;超越時間&#xff0c;擁抱空間 在前兩篇章中&#xff0c;我們已經走過了漫長而深刻的旅程。我們學會了用常微分方程&#xff08;ODE&#xff09;來描述事物如何隨時間演化&#xff0c;從一個初始狀態出發&#xff0c;描繪出一條獨一無二的生命軌跡。我們還學會…

Flutter基礎(基礎概念和方法)

概念比喻StatefulWidget會變魔術的電視機State電視機的小腦袋&#xff08;記信息&#xff09;build 方法電視機變身顯示新畫面setState按遙控器按鈕改變狀態Scaffold電視機的外殼 StatefulWidget&#xff1a;創建一個按鈕組件。State&#xff1a;保存點贊數&#xff08;比如 i…

K8s——Pod(1)

目錄 基本概念 ?一、Pod 的原理? ?二、Pod 的特性? ?三、Pod 的意義? 狀態碼詳解 ?一、Pod 核心狀態詳解? ?二、其他關鍵狀態標識? ?三、狀態碼運維要點? 探針 ?一、探針的核心原理? ?二、三大探針的特性與作用? ?參數詳解? ?三、探針的核心意義…

MySQL 存儲過程面試基礎知識總結

文章目錄 MySQL 存儲過程面試基礎知識總結一、存儲過程基礎&#xff08;一&#xff09;概述1.優點2.缺點 &#xff08;二&#xff09;創建與調用1.創建存儲過程2.調用存儲過程3.查看存儲過程4.修改存儲過程5.存儲過程權限管理 &#xff08;三&#xff09;參數1.輸入參數2.輸出參…

NLP文本數據增強

文章目錄 文本數據增強同義詞替換示例Python代碼示例 隨機插入示例Python代碼示例 隨機刪除示例Python代碼示例 回譯&#xff08;Back Translation&#xff09;示例Python代碼示例 文本生成模型應用方式示例Python代碼示例 總結 文本數據增強 數據增強通過對原始數據進行變換、…

(LeetCode 每日一題) 594. 最長和諧子序列 (哈希表)

題目&#xff1a;594. 最長和諧子序列 思路&#xff1a;哈希表&#xff0c;時間復雜度0(n)。 用哈希表mp來記錄每個元素值出現的次數&#xff0c;然后枚舉所有值x&#xff0c;看其x1是否存在&#xff0c;存在的話就可以維護最長的子序列長度mx。 C版本&#xff1a; class Sol…

FreePDF:讓看英文文獻像喝水一樣簡單

前言 第一次看英文文獻&#xff0c;遇到不少看不懂的英文單詞&#xff0c;一個個查非常費勁。 后來&#xff0c;學會了使用劃詞翻譯&#xff0c;整段整段翻譯查看&#xff0c;極大提升看文獻效率。 最近&#xff0c;想到了一種更快的看文獻的方式&#xff0c;那就是把英文PD…

Scikit-learn:機器學習的「萬能工具箱」

——三行代碼構建AI模型的全棧指南** ### **一、誕生背景&#xff1a;讓機器學習從實驗室走向大眾** **2010年前的AI困境**&#xff1a; - 學術界模型難以工程化 - 算法實現碎片化&#xff08;MATLAB/C主導&#xff09; - 企業應用門檻極高 > **破局者**&#xff1a;Da…

GPT-1論文閱讀:Improving Language Understanding by Generative Pre-Training

這篇論文提出了 GPT (Generative Pre-Training) 模型&#xff0c;這是 GPT系列&#xff08;包括 GPT-2, GPT-3, ChatGPT, GPT-4 等&#xff09;的奠基之作。它標志著自然語言處理領域向大規模無監督預訓練任務特定微調范式的重大轉變&#xff0c;并取得了顯著的成功。 文章鏈接…

Hadoop大數據-Mysql的數據同步工具Maxwell安裝與使用( 詳解)

目錄 一、前置基礎知識 1、主從復制&#xff08;Replication&#xff09; 2、數據恢復 3、數據庫熱備 4、讀寫分離 5、存儲位置及命名 二、Maxwell簡介 1、簡介 2、Maxwell同步數據特點 2.1.歷史記錄同步 2.2.斷點續傳 三、前期準備 1、查看網卡&#xff1a; 2、…

分布式系統的一致性模型:核心算法與工程實踐

目錄 一、分布式一致性的核心挑戰二、主流一致性算法原理剖析1. Paxos&#xff1a;理論基礎奠基者2. Raft&#xff1a;工業級首選方案3. ZAB&#xff1a;ZooKeeper的引擎 三、算法實現與代碼實戰Paxos基礎實現&#xff08;Python偽代碼&#xff09;Raft日志復制核心邏輯 四、關…

Apache HTTP Server部署全攻略

httpd 簡介 httpd&#xff08;Apache HTTP Server&#xff09;是一款歷史悠久的開源 Web 服務器軟件&#xff0c;由 Apache 軟件基金會開發和維護。自 1995 年首次發布以來&#xff0c;Apache 一直是 Web 服務器領域的領導者&#xff0c;以其穩定性、安全性和靈活性著稱。根據…

信號處理學習——文獻精讀與code復現之TFN——嵌入時頻變換的可解釋神經網絡(下)

書接上文: 信號處理學習——文獻精讀與code復現之TFN——嵌入時頻變換的可解釋神經網絡&#xff08;上&#xff09;-CSDN博客 接下來是重要的代碼復現&#xff01;&#xff01;&#xff01;GitHub - ChenQian0618/TFN: this is the open code of paper entitled "TFN: A…

線上故障排查:簽單合同提交報錯分析-對接e簽寶

在企業管理系統中&#xff0c;合同生成與簽署環節至關重要&#xff0c;尤其是在使用第三方平臺進行電子簽署時。本文將通過實際的報錯信息&#xff0c;分析如何進行線上故障排查&#xff0c;解決合同生成過程中出現的問題。 #### 1. 錯誤描述 在嘗試生成合同并提交至電子簽署…

知攻善防靶機 Linux easy溯源

知攻善防 【護網訓練-Linux】應急響應靶場-Easy溯源 小張是個剛入門的程序猿&#xff0c;在公司開發產品的時候突然被叫去應急&#xff0c;小張心想"早知道簡歷上不寫會應急了"&#xff0c;于是call了運維小王的電話&#xff0c;小王說"你面試的時候不是說會應急…

原神八分屏角色展示頁面(純前端html,學習交流)

原神八分屏角色展示頁面 - 一個精美的前端交互項目 項目簡介 這是一個基于原神游戲角色制作的八分屏展示頁面&#xff0c;采用純前端技術實現&#xff0c;包含了豐富的動畫效果、音頻交互和視覺設計。項目展示了一些熱門原神角色&#xff0c;每個角色都有獨立的介紹頁面和專屬…