vue3中 ref() 和 reactive() 的區別

在 Vue 3 中,ref()reactive() 是兩種核心的響應式 API,用于創建和管理響應式數據。它們各有適用場景,理解它們的區別和用法對開發至關重要。以下是詳細對比和示例:


1.?ref()?的用法

1.1 基本概念
  • ref()?用于創建一個響應式引用,適用于基本數據類型(如?numberstringboolean)和復雜數據類型(如對象、數組)。
  • 返回值是一個帶有?.value?屬性的對象,即使傳入的是復雜數據類型,也需通過?.value?訪問或修改值。
1.2 使用場景
  • 需要直接操作基本數據類型(如計數器、布爾值)。
  • 需要將整個對象或數組作為單一值管理(如動態替換整個對象)。
  • 需要與 Vue 2 的?this.$data?行為兼容。
1.3 示例
import { ref } from 'vue';// 基本數據類型
const count = ref(0); // 創建一個響應式整數
console.log(count.value); // 讀取值:0
count.value++; // 修改值:1// 復雜數據類型
const user = ref({ name: 'Alice', age: 20 }); // 創建一個響應式對象
console.log(user.value.name); // 讀取對象屬性
user.value.age = 21; // 修改對象屬性// 數組
const list = ref([1, 2, 3]); // 創建一個響應式數組
list.value.push(4); // 修改數組
1.4 模板中使用

在模板中無需 .value,Vue 會自動解包:

<template><div>{{ count }}</div> <!-- 自動顯示 count.value --><div>{{ user.name }}</div> <!-- 自動顯示 user.value.name -->
</template>

2.?reactive()?的用法

2.1 基本概念
  • reactive()?用于創建一個響應式對象,適用于復雜數據類型(對象或數組)。
  • 返回值是一個代理對象(Proxy),直接訪問或修改屬性即可觸發響應式更新,無需?.value
2.2 使用場景
  • 管理嵌套復雜的對象或數組(如表單數據、配置對象)。
  • 需要直接操作對象屬性而不想用?.value
2.3 示例
import { reactive } from 'vue';// 對象
const user = reactive({ name: 'Bob', age: 25 }); // 創建響應式對象
console.log(user.name); // 直接訪問屬性
user.age = 26; // 直接修改屬性// 數組
const list = reactive([1, 2, 3]); // 創建響應式數組
list.push(4); // 直接修改數組
2.4 模板中使用

直接綁定屬性名:

<template><div>{{ user.name }}</div> <!-- 直接訪問 user.name --><div>{{ list[0] }}</div> <!-- 直接訪問數組元素 -->
</template>

3.?ref()?與?reactive()?的區別

特性ref()reactive()
適用數據類型基本類型、對象、數組僅對象或數組
返回值類型帶?.value?的對象代理對象(Proxy)
訪問/修改方式refValue.valuereactiveObject.property
模板中使用自動解包,無需?.value直接訪問屬性
深度響應式是(若傳入對象,內部會調用?reactive是(嵌套對象/數組自動代理)
替換整個對象可以(ref.value = newObject不推薦(直接替換會丟失響應式)
性能優化基礎類型更輕量復雜對象更高效

4. 綜合示例對比

4.1 場景:計數器
  • ref()
    const count = ref(0);
    function increment() {count.value++;
    }
  • reactive()
    const state = reactive({ count: 0 });
    function increment() {state.count++;
    }
4.2 場景:表單數據
  • ref()
    const formData = ref({ name: '', email: '' });
    formData.value.name = 'Alice'; // 修改需 .value
  • reactive()
    const formData = reactive({ name: '', email: '' });
    formData.name = 'Alice'; // 修改無需 .value
4.3 場景:動態替換對象
  • ref()
    const user = ref({ name: 'Alice' });
    user.value = { name: 'Bob' }; // 安全替換整個對象
  • reactive()
    const user = reactive({ name: 'Alice' });
    user = reactive({ name: 'Bob' }); // 錯誤!不能直接替換 reactive 對象

5. 企業級最佳實踐

  1. 選擇原則

    • 基礎類型?→?ref()
    • 對象/數組?→?reactive()
    • 需要替換整個對象?→?ref()
    • 嵌套復雜結構?→?reactive()
  2. 避免陷阱

    • 解構響應式對象:使用?toRefs()?保持響應式。
      const state = reactive({ count: 0, name: 'Alice' });
      const { count, name } = toRefs(state); // 保持響應式
    • 大型靜態數據:避免用?reactive()?包裹,改用?markRaw()?標記非響應式。
  3. 性能優化

    • 高頻更新基礎類型(如動畫幀數) → 優先?ref()
    • 大型嵌套對象 → 優先?reactive()

6. 總結

  • ref():適合簡單值或需要替換整個對象的場景,使用?.value?訪問。
  • reactive():適合復雜嵌套對象,直接訪問屬性,代碼更簡潔。
  • 核心區別ref()?是?reactive()?的“包裝器”,在處理對象時內部會調用?reactive(),但需要通過?.value?操作。

根據實際需求選擇合適的 API,可以提升代碼的可維護性和性能。

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

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

相關文章

告別加班!這款Axure移動端元件庫,讓你原型效率提升300%

一、 產品概述 這是一套專為 Axure RP 9/10/11 設計的高質量、高保真移動端&#xff08;APP&#xff09;組件庫。它旨在幫助產品經理、UI/UX 設計師和交互設計師快速、高效地繪制出美觀且交互豐富的移動端原型&#xff0c;極大提升設計效率和原型保真度。 二、 核心內容與特點…

深入理解synchronized:從使用到原理的進階指南

目錄 一、核心機制深度解析 1. 對象頭&#xff08;Object Header&#xff09;與Mark Word的奧秘 2. Monitor&#xff1a;同步的實質 二、鎖升級的全過程與底層操作 1. 無鎖 -> 偏向鎖 2. 偏向鎖 -> 輕量級鎖 3. 輕量級鎖 -> 重量級鎖 三、高級話題與實戰調優 …

4.1 - 拖鏈電纜(柔性電纜)與固定電纜

本文介紹固定電纜和拖鏈專用線纜的對比、以及使用注意事項。尤其是在伺服的電纜選型上&#xff0c;一定要注意。總結成兩點&#xff1a;1). 在移動場合&#xff0c;一定要選用拖鏈電纜&#xff0c;不要用普通電纜去代替&#xff0c;否則很快就會損壞&#xff0c;甚至造成安全隱…

S32K3平臺eMIOS 應用說明

S32K3 系列 eMIOS 介紹 1.1 資源介紹 該設備具有 3 個 eMIOS 模塊&#xff0c;每個模塊的配置如表 1.1 所示。1.2 功能介紹 eMIOS 提供了用于生成或測量時間事件的功能。它使用 UCs&#xff0c;您可以為不同的芯片應 用中的不同功能進行編程。此外&#xff0c;eMIOS 體系結構允…

Next.js中服務器端渲染 (SSR) 詳解:動態內容與 SEO 的完美結合

Next.js中服務器端渲染 (SSR) 詳解&#xff1a;動態內容與 SEO 的完美結合 作者&#xff1a;碼力無邊在上一篇文章中&#xff0c;我們深入探討了靜態站點生成 (SSG) 的強大之處&#xff0c;它通過在構建時預先生成頁面&#xff0c;為用戶提供了極致的訪問速度。但現實世界是動態…

c# winform 使用DevExpress制作表格

環境配置創建c# winform 新項目 test_devexpress添加引用把DevExpress.XtraGrid.v17.1.dll拖到工具箱在界面中&#xff0c;加入2個 GridControl設計器代碼&#xff1a;namespace test_devexpress {partial class Form1{/// <summary>/// 必需的設計器變量。/// </summ…

數據庫之間如何同步

數據庫之間如何同步&#xff1a;三種高效方法詳解 數據同步無小事&#xff0c;選對方法事半功倍 在現代數據驅動的環境中&#xff0c;??數據庫之間如何同步??是確保業務連續性和數據一致性的核心技術。本文將深入介紹三種主流的數據庫同步方法&#xff0c;幫助您根據實際需…

《我的世界》中實現強化學習(RL)算法

在《我的世界》中實現強化學習&#xff08;RL&#xff09;是一個巨大的挑戰&#xff0c;而獎勵函數&#xff08;Reward Function&#xff09;的設計是其中最核心、最困難的部分&#xff0c;直接決定了算法能否成功學習。 下面我將為你提供一個系統的設計框架、策略和注意事項。…

智能光場:深度學習重構計算光學成像新范式!

1.掌握深度學習算法的原理和應用&#xff0c;剖析計算成像主流研究范圍及關聯的統一計算范式&#xff0c;能夠運用深度學習技術對光學成像系統進行創新設計和優化。2.掌握利用深度學習從成像設備優化設計、典型計算成像任務以及后端的計算機視覺任務的認知框架&#xff0c;并掌…

深入理解 MyBatis-Plus 的 QueryWrapper:動態 SQL 構建的利器

關鍵詞&#xff1a;MyBatis-Plus、QueryWrapper、動態 SQL、Java、ORM 一、引言 在 Java 后端開發中&#xff0c;MyBatis-Plus&#xff08;簡稱 MP&#xff09;作為 MyBatis 的增強工具&#xff0c;極大地簡化了 CRUD 操作。而其中最核心的功能之一&#xff0c;就是動態 SQL 的…

WMIC用法

WMIC用法基本語法結構1. 全局開關&#xff08;可選&#xff0c;控制整體行為&#xff09;2. 別名&#xff08;Alias&#xff09;3. 動詞&#xff08;Verb&#xff09;4. 參數&#xff08;可選&#xff09;常用示例幫助命令WMIC&#xff08;Windows Management Instrumentation …

Spring Boot--yml配置信息書寫和獲取

案例&#xff1a;Spring Boot整合Mybatis步驟一&#xff1a;導入依賴步驟二&#xff1a;添加數據庫需要的數據源配置步驟三&#xff1a;編寫實體類步驟四&#xff1a;創建mapper類&#xff0c;操作數據庫步驟五&#xff1a;創建Service接口和接口實現類步驟六&#xff1a;創建C…

創作紀念日·512天

嘿嘿&#xff0c;不知不覺間&#xff0c;已經到了512天創作紀念日了。 回憶 遙想我在《我的創作紀念日》一篇中寫道&#xff0c;想要改名為 十二 &#xff0c;作為對過去生活的懷念&#xff0c;沒想到這個名字被搶了&#xff0c;好可惜。 想到25年4月13日寫紀念日博客時的自己…

在 Berachain 上,如何通過 BERA 實現一魚多吃?

Berachain 的 PoL&#xff08;Proof of Liquidity&#xff09;機制是其最具辨識度的創新之一。通過將 DeFi 的激勵邏輯深度嵌入共識層&#xff0c;不僅為底層網絡注入了充足的流動性&#xff0c;保障了安全性&#xff0c;同時也有效推動了生態應用的增長&#xff0c;更為用戶創…

LangGraph和aiagent

1. LangGraph&#xff1a;用圖思維重構Agent工作流LangGraph是LangChain團隊開源的圖式Agent編排框架&#xff0c;它基于"有向圖"模型&#xff0c;將Agent的運行流程抽象為"節點 狀態流轉"。其核心設計理念是用有向狀態圖&#xff08;Directed State Grap…

《從iptables到ipvs:云原生網絡轉發的性能拐點突破》

這套基于Spring Cloud Alibaba搭建的架構,部署于阿里云ACK集群的10個4核8G節點上,默認配置6個Pod副本,搭配HPA彈性擴縮容機制與Ingress網關流量分發,理論上具備應對3倍日常流量的承載能力。然而實際運行中,每日早9點、午2點、晚8點三次流量峰值來臨時,訂單服務會在120秒內…

大數據存儲域——Kafka設計原理

摘要本文主要介紹了Kafka的架構原理、消息訂閱模式以及在金融風控等領域的應用。Kafka作為數據中轉站&#xff0c;可同步不同系統數據&#xff0c;支持事件驅動架構&#xff0c;廣泛應用于金融支付與風控場景。其架構包括Producer、Broker、Topic、Partition、Replication、Mes…

[特殊字符] GitHub 熱門開源項目速覽(2025/09/09)

今天為大家整理了近期 GitHub 上熱度較高的開源項目&#xff0c;涵蓋 AI Agent、加密計算、操作系統、機器人、PDF 工具 等多個方向。讓我們一起看看都有哪些值得關注的項目吧&#xff01; &#x1f539; AI Agents & 開發者工具 parlant &#xff08;? 10.9k | ?? 117…

OpenHarmony之USB Manager 架構深度解析

1. 整體架構 OpenHarmony USB管理器采用三層架構設計: USB API:提供USB的基礎API,主要包含查詢USB設備的列表、設備插拔通知、USB HOST/DEVICE 功能切換、批量數據傳輸、控制命令傳輸、USB設備打開的權限控制及USB device模式下的function功能切換等。 USB Service:主要實…

java面試中經常會問到的mysql問題有哪些(基礎版)

文章目錄一、基礎概念與存儲引擎二、索引設計與優化&#xff08;高頻重點&#xff09;三、事務與鎖&#xff08;核心原理&#xff09;四、SQL性能優化與問題排查五、高可用與數據安全六、其他高頻細節問題在Java面試中&#xff0c;MySQL作為最常用的關系型數據庫&#xff0c;是…