Vue3 Composition API 深度解析:告別Options API的局限性

目錄

一、為什么需要Composition API?

二、核心概念:setup()?函數

三、響應式核心:ref()?和?reactive()

1.?ref?- 處理基本類型/對象

?2.?reactive?- 處理對象

四、生命周期鉤子新寫法

五、強大的邏輯復用:組合式函數

六、響應式計算:computed?&?watch

1. 計算屬性

?2. 偵聽器

七、最佳實踐指南

八、對比Options API?

結語


一、為什么需要Composition API?

在Vue2中,我們使用?Options API(data、methods、computed等選項)組織代碼。當組件功能復雜時,相同邏輯的代碼被分散到不同選項中,導致:

  • 可讀性下降

  • 邏輯復用困難(依賴mixins)

  • Typescript支持有限

Vue3的?Composition API?通過邏輯功能組合解決了這些問題,讓代碼更靈活、更可維護!

?

二、核心概念:setup()?函數

Composition API的入口是?setup()?函數,它在組件創建前執行,替代了Vue2的data()created()等選項

import { ref } from 'vue';export default {setup() {// 定義響應式數據const count = ref(0);// 定義方法const increment = () => {count.value++;};// 暴露給模板return { count, increment };}
}

?

關鍵點

  1. setup()?在?beforeCreate?前執行,沒有?this

  2. 返回對象中的屬性會暴露給模板使用

  3. 所有Composition API函數都需要在此引入

?

三、響應式核心:ref()?和?reactive()

1.?ref?- 處理基本類型/對象

const num = ref(0);       // { value: 0 }
const user = ref({ name: 'Leo' });console.log(num.value);   // 訪問值
num.value = 5;            // 修改值

?2.?reactive?- 處理對象

const state = reactive({count: 0,user: { name: 'Alice' }
});state.count = 10;         // 直接修改屬性
特性refreactive
數據類型任意對象
模板訪問自動解包直接訪問屬性
重新賦值.value?修改不能直接替換對象

?

四、生命周期鉤子新寫法

setup()中使用生命周期前綴加on

import { onMounted, onUpdated } from 'vue';setup() {onMounted(() => {console.log('組件掛載完成!');});onUpdated(() => {console.log('組件更新了!');});
}

?

Vue2選項Composition API等價
beforeCreatesetup()?自身
createdsetup()?自身
mountedonMounted
updatedonUpdated

?

五、強大的邏輯復用:組合式函數

將相同邏輯抽離為可復用函數(替代mixins):

// useCounter.js
import { ref } from 'vue';export default function useCounter() {const count = ref(0);const increment = () => count.value++;const decrement = () => count.value--;return { count, increment, decrement };
}

?在組件中使用:

import useCounter from './useCounter';setup() {const { count, increment } = useCounter();return { count, increment };
}

優勢

  • 顯式暴露使用的屬性和方法

  • 多個組合函數互不沖突

  • 完美支持TypeScript類型推斷

?

六、響應式計算:computed?&?watch

1. 計算屬性

const doubleCount = computed(() => count.value * 2);

?2. 偵聽器

// 偵聽單個ref
watch(count, (newVal, oldVal) => {console.log(`計數變化:${oldVal} → ${newVal}`);
});// 偵聽多個源
watch([count, name], ([newCount, newName]) => {// 處理變化
});

七、最佳實踐指南

  1. 按功能組織代碼:將同一功能的refcomputedwatch放在一起

  2. 復雜組件使用<script setup>語法糖(SFC專屬):

    <script setup>
    import { ref } from 'vue';
    const count = ref(0); // 自動暴露到模板
    </script>
  3. 組合函數命名以use開頭(如useMouseTracker

  4. 需要DOM時使用ref綁定元素

    <template><div ref="root">元素</div>
    </template><script>
    import { ref, onMounted } from 'vue';
    export default {setup() {const root = ref(null);onMounted(() => {console.log(root.value); // 獲取DOM元素});return { root };}
    }
    </script>

八、對比Options API?

// Options API (Vue2風格)
export default {data() {return { count: 0 }},methods: {increment() { this.count++ }},mounted() {console.log('mounted');}
}// Composition API (Vue3)
export default {setup() {const count = ref(0);const increment = () => { count.value++ };onMounted(() => console.log('mounted'));return { count, increment };}
}

?

結語

Composition API 賦予了Vue開發者更自由的代碼組織能力,尤其適合:

  • 大型項目開發

  • 需要高復用性的場景

  • TypeScript深度集成

雖然學習曲線稍陡峭,但它帶來的可維護性提升絕對值得投入!現在就開始重構你的Vue組件吧!

?

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

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

相關文章

IoT/HCIP實驗-5/基于NB-IoT的智慧農業實驗(平臺側開發+端側編碼+基礎調試分析)

文章目錄 概述擴展板 E53_IA1智慧農業平臺測開發功能定義/模型開發編解碼插件開發-消息編解碼插件開發-關聯編解碼插件開發-部署注冊實際設備 智慧農業端側編碼工程配置數據結構定義數據收集任務數據上報任務設備接入過程正確設置接入參數命令響應任務 程序調試其他 概述 本實…

多網絡環境vmware虛擬機配置

環境&#xff1a;一臺臺式機、一臺筆記本、筆記本中安裝虛擬機。臺式機及筆記本都使用wifi連接。 實現效果&#xff1a;虛擬機采用固定ip方式&#xff0c;臺式機可以直接連接虛擬機。 1、VMware環境配置 臺式機ip&#xff1a;192.168.31.43 筆記本ip&#xff1a;192.168.31.…

ZArchiver×亞矩云手機:云端文件管理的“超維解壓”革命

在數字化辦公與移動應用生態中&#xff0c;文件壓縮與解壓是高頻剛需場景&#xff0c;但傳統本地工具受限于設備性能、存儲空間及跨平臺協作痛點。ZArchiver&#xff08;輕量級壓縮工具&#xff09;與亞矩云手機的結合&#xff0c;通過“云端算力虛擬化環境”的創新模式&#x…

微幀WZVQA:極致還原人眼感知,精準評估視頻畫質

隨著移動互聯網的不斷發展以及智能手機的普及&#xff0c;短視頻已逐步取代圖片和文字&#xff0c;躋身主流媒體形式的前列。短視頻平臺的興起&#xff0c;讓數十億用戶可以制作&#xff0c;分享并接收彼此的信息&#xff0c;為人們開辟了一條全新的知識獲取途徑。然而&#xf…

信創 CDC 實戰|國產數據庫的數據高速通道:OceanBase 實時入倉 StarRocks

國產數據庫加速進入核心系統&#xff0c;傳統同步工具卻頻頻“掉鏈子”。本系列文章聚焦 OceanBase、GaussDB、TDSQL、達夢等主流信創數據庫&#xff0c;逐一拆解其日志機制與同步難點&#xff0c;結合 TapData 的實踐經驗&#xff0c;系統講解從 CDC 捕獲到實時入倉&#xff0…

Unity 通過AVProMovieCapture插件實現攝像機錄屏

1.AVProMovieCapture插件下載 沒什么好說的&#xff0c;搞到安裝包之后&#xff0c;直接往項目中拉就行。 2.操作面板配置 &#xff08;1&#xff09;在Hierarchy創建一個空物體&#xff0c;上面添加Capture From Camera和Camera Selector兩個插件 &#xff08;2&#xff09…

深度學習:PyTorch卷積神經網絡分享(1)

本文目錄&#xff1a; 一、CNN概述二、CNN日常應用三、CNN的卷積層&#xff08;一 &#xff09;基本介紹&#xff08;二&#xff09;卷積層計算1.對輸入數據的要求2.卷積核核心參數3.計算過程4.特征圖尺寸計算5.1、多通道卷積計算5.2、多卷積核計算6.PyTorch卷積層API 前言&…

Cesium添加3dtiles并平移到指定經緯度

訪問tileset.json,查看root.transform,12,13,14分別代表模型參考原點的地心坐標Cartesian3(x,y,z) let tileset await Cesium.Cesium3DTileset.fromUrl()構造origin_cartesian3new Cesium.Cartesian3(x,y,z) 設置待平移到的位置經緯高為longitude,latitude,height,例如(116,…

STM32G070x 單片機項目代碼解析:基于 HAL 庫的嵌入式系統開發

項目總體架構 該項目采用標準的 STM32 工程結構&#xff0c;主要包含以下幾個部分&#xff1a; 頭文件包含&#xff1a;系統頭文件和用戶自定義頭文件外設句柄定義&#xff1a;SPI、TIM、UART 等外設的句柄聲明用戶自定義變量&#xff1a;LED 控制、按鍵狀態等標志位初始化函數…

winform mvvm

if (!mvvmContext1.IsDesignMode) InitializeBindings(); 這段代碼的意思是&#xff1a;如果當前應用程序不是處于設計模式&#xff08;即程序正在運行&#xff09;&#xff0c;就調用InitializeBindings方法來初始化視圖與視圖模型之間的綁定。 void Initiali…

防火墻快速管理軟件,66K超小巧

軟件介紹 今天為大家推薦一款輕量級的Windows防火墻管理工具&#xff0c;這款工具能幫助用戶快速開啟或關閉系統防火墻功能&#xff0c;操作比系統原生設置更加便捷高效。 軟件優勢 相比通過系統設置層層點擊的操作方式&#xff0c;這款僅66KB大小的微型工具只需單擊按鈕…

python中的高級變量III

python中的高級變量III 刪除列表元素&#xff08;list&#xff09;擴展知識點 name_list ["Mike","John","Alice"] del name_list[1] # 通過del name_list[1]刪除“John” print(name_list) # 輸出 [Mike, Alice]注意&#xff1a;del …

深入理解Redis

深入理解Redis&#xff1a;高性能內存數據庫的核心原理與應用實踐 1. 引言 在現代互聯網應用中&#xff0c;高性能、低延遲的數據訪問是至關重要的。傳統的關系型數據庫&#xff08;如MySQL&#xff09;雖然功能強大&#xff0c;但在高并發場景下往往成為性能瓶頸。Redis&…

界面控件DevExpress Blazor中文教程:AI聊天 - 如何實現函數調用?

DevExpress Blazor UI組件使用了C#為Blazor Server和Blazor WebAssembly創建高影響力的用戶體驗&#xff0c;這個UI自建庫提供了一套全面的原生Blazor UI組件&#xff08;包括Pivot Grid、調度程序、圖表、數據編輯器和報表等&#xff09;。 現代AI驅動的應用程序需要與外部系…

github 上的php項目

github 上的php項目 項目的網址 &#xff08;Loong1996/LikeGirlSite: 情侶網站、情侶網頁、戀愛記錄網站&#xff09; # 修改 # admin/Config_DB.php//localhost 為數據庫地址 一般使用默認的即可 或&#xff08;127.0.0.1&#xff09; $db_address "mysql_php";/…

區間求最值問題高效解決方法

對于區間求最值場景&#xff0c;如果區間不定長度的&#xff0c;可以使用稀疏表進行求解&#xff0c;如果區間是固定長度的&#xff0c;則可以使用分塊的思想&#xff08;與稀疏表原理類似&#xff09;&#xff0c;都是通過壓縮狀態個數&#xff0c; 1 關于稀疏表的原理詳見&a…

Linux程序設計:什么時候選擇開發內核模塊?

最近看一個CPU使用率高的問題,從perf里看,是下面的一個占用的比較多是下面一個 Overhead Source:Line Symbol Shared Object - 8.48% [vdso][1129] 0x1129 B [.] 0x0000000000001129

OpenCV CUDA模塊設備層-----歐幾里得距離函數hypot()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 該函數用于計算兩個無符號字符向量&#xff08;uchar1&#xff09;的歐幾里得距離&#xff08;即直角三角形的斜邊長度&#xff09;&#xff0c;…

惠普HP LaserJet Pro P1106 打印機信息

基本信息 產品類型&#xff1a;黑白激光打印機。上市時間&#xff1a;2011 年。最大打印幅面&#xff1a;A4。網絡打印&#xff1a;不支持網絡打印。雙面打印&#xff1a;手動雙面打印。 性能參數 打印速度&#xff1a;黑白打印速度&#xff08;ISO&#xff0c;A4&#xff09;正…

通義靈碼智能體模式在企業級開發中的應用:以云效DevOps自動化流程為例

一、智能體模式的核心能力 通義靈碼的智能體模式區別于傳統代碼補全工具&#xff0c;具備&#xff1a; 語義級理解&#xff1a;解析業務需求、代碼上下文及錯誤日志。自主任務閉環&#xff1a;從問題診斷→ 代碼生成→ 測試覆蓋→ 文檔生成全流程自動化。環境感知&#xff1a…