Vue 組合式 API 與 選項式 API 全面對比教程

一、前言:Vue 的兩種 API 風格

Vue 提供了兩種編寫組件邏輯的方式:組合式 API (Composition API)選項式 API (Options API)。理解這兩種方式的區別和適用場景,對于 Vue 開發者至關重要。

為什么會有兩種 API?

  • 選項式 API:Vue 2 的傳統方式,按照選項(data、methods 等)組織代碼
  • 組合式 API:Vue 3 引入的新方式,基于函數組合邏輯,更適合復雜組件

二、選項式 API (Options API) 詳解

1. 基本結構

<script>
export default {// 數據選項data() {return {count: 0,message: 'Hello Vue!'}},// 計算屬性computed: {reversedMessage() {return this.message.split('').reverse().join('')}},// 方法methods: {increment() {this.count++}},// 生命周期鉤子mounted() {console.log('組件已掛載')}
}
</script><template><div><p>{{ message }}</p><p>反轉: {{ reversedMessage }}</p><button @click="increment">計數: {{ count }}</button></div>
</template>

2. 選項式 API 的特點

  • 按選項組織代碼:將代碼分為 data、methods、computed 等固定選項
  • this 上下文:通過 this 訪問組件實例
  • 隱式響應式:data 返回的對象自動成為響應式
  • 適合簡單組件:邏輯較少時結構清晰

3. 生命周期鉤子

export default {beforeCreate() {},created() {},beforeMount() {},mounted() {},beforeUpdate() {},updated() {},beforeUnmount() {},unmounted() {}
}

三、組合式 API (Composition API) 詳解

1. 基本結構(<script setup> 語法)

<script setup>
import { ref, computed, onMounted } from 'vue'// 響應式狀態
const count = ref(0)
const message = ref('Hello Vue!')// 計算屬性
const reversedMessage = computed(() => {return message.value.split('').reverse().join('')
})// 方法
function increment() {count.value++
}// 生命周期鉤子
onMounted(() => {console.log('組件已掛載')
})
</script><template><div><p>{{ message }}</p><p>反轉: {{ reversedMessage }}</p><button @click="increment">計數: {{ count }}</button></div>
</template>

2. 組合式 API 的特點

  • 基于函數:通過導入函數實現各種功能
  • 邏輯組合:可以自由組織相關代碼
  • 顯式響應式:需要明確使用 ref/reactive
  • 更好的 TypeScript 支持:類型推斷更自然
  • 邏輯復用:可以提取和重用邏輯(組合函數)

3. 核心響應式 API

API用途選項式 API 對應物
ref創建基本類型的響應式數據data 中的基本類型
reactive創建對象的響應式代理data 中的對象
computed創建計算屬性computed 選項
watch監聽響應式數據變化watch 選項
watchEffect自動追蹤依賴的響應式效果-

4. 生命周期鉤子對照

選項式 API組合式 API
beforeCreate不需要(直接寫在 setup 中)
created不需要(直接寫在 setup 中)
beforeMountonBeforeMount
mountedonMounted
beforeUpdateonBeforeUpdate
updatedonUpdated
beforeUnmountonBeforeUnmount
unmountedonUnmounted

四、兩種 API 的深度對比

1. 代碼組織方式

選項式 API

export default {data() { /*...*/ },    // 數據computed: { /*...*/ }, // 計算屬性methods: { /*...*/ },  // 方法watch: { /*...*/ }     // 監聽器
}

組合式 API

// 功能A相關代碼
const { x, y } = useFeatureA()// 功能B相關代碼
const { a, b } = useFeatureB()

2. 邏輯復用對比

選項式 API 復用(mixins)

// mixin.js
export default {data() {return {mixinData: 'Mixin Data'}},methods: {mixinMethod() { /*...*/ }}
}// 組件中使用
import myMixin from './mixin.js'
export default {mixins: [myMixin]
}

組合式 API 復用(組合函數)

// useFeature.js
export function useFeature() {const state = ref(null)function doSomething() { /*...*/ }return { state, doSomething }
}// 組件中使用
import { useFeature } from './useFeature.js'
const { state, doSomething } = useFeature()

3. 類型支持對比

  • 選項式 API:類型推斷有限,特別是在使用 mixins 時
  • 組合式 API:天然支持 TypeScript,類型推斷更準確

五、何時使用哪種 API?

選項式 API 適合:

  • 小型到中型項目
  • 簡單組件開發
  • 熟悉 Vue 2 的開發者
  • 需要快速原型開發時

組合式 API 適合:

  • 大型復雜項目
  • 需要更好邏輯組織的組件
  • 需要邏輯復用的場景
  • TypeScript 項目
  • 團隊希望統一代碼風格

六、組合式 API 進階技巧

1. 自定義組合函數示例

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

組件中使用:

<script setup>
import { useCounter } from './useCounter'const { count, increment } = useCounter(10)
</script><template><button @click="increment">Count: {{ count }}</button>
</template>

2. 異步狀態管理

<script setup>
import { ref } from 'vue'const data = ref(null)
const loading = ref(false)
const error = ref(null)async function fetchData() {loading.value = trueerror.value = nulltry {const response = await fetch('/api/data')data.value = await response.json()} catch (err) {error.value = err} finally {loading.value = false}
}// 立即獲取數據
fetchData()
</script>

3. 組件通信

<!-- Parent.vue -->
<script setup>
import { ref } from 'vue'
import Child from './Child.vue'const msg = ref('Hello from parent')
</script><template><Child v-model="msg" />
</template><!-- Child.vue -->
<script setup>
defineProps(['modelValue'])
defineEmits(['update:modelValue'])
</script><template><input:value="modelValue"@input="$emit('update:modelValue', $event.target.value)"/>
</template>

七、遷移策略:從選項式到組合式

1. 漸進式遷移

  • 新組件使用組合式 API
  • 舊組件逐步重構
  • 混合使用(在選項式組件中使用 setup 選項)

2. 對應關系記憶卡

選項式 API組合式 API
this不需要,直接訪問變量
data()ref()reactive()
methods普通函數
computedcomputed()
watchwatch()watchEffect()
生命周期鉤子onXxx() 系列函數
propsdefineProps()
emitsdefineEmits()
mixins組合函數

八、常見問題解答

1. 兩種 API 可以混用嗎?

可以,但不推薦。在 Vue 3 中,你可以在組件中使用 setup() 選項來使用組合式 API,同時保留其他選項。

2. 組合式 API 更難學嗎?

對于 Vue 新手,選項式 API 可能更容易上手。但有其他框架經驗的開發者,組合式 API 可能更直觀。

3. 性能有差異嗎?

兩種 API 在性能上沒有顯著差異,組合式 API 在某些場景下可能有輕微優勢。

4. 公司項目該用哪種?

新項目推薦組合式 API,舊項目可以逐步遷移。團隊統一風格最重要。

九、總結

Vue 的兩種 API 風格各有優勢:

  • 選項式 API:結構清晰,學習曲線平緩,適合簡單場景
  • 組合式 API:靈活強大,便于邏輯復用和組織,適合復雜場景

建議開發者:

  1. 先掌握選項式 API 理解 Vue 核心概念
  2. 逐漸過渡到組合式 API
  3. 根據項目需求和個人偏好選擇合適的方式
  4. 大型項目推薦統一使用組合式 API

組合式 API 代表了 Vue 的未來發展方向,特別是對于復雜應用和需要良好 TypeScript 支持的項目。選項式 API 仍會長期支持,適合維護舊項目和簡單場景。

創作不易,如果您都看到這里了,可以給我一個點贊、收藏并關注一下么?您的支持與喜愛是激勵我創作的最大動力!

如果內容有誤請及時聯系我進行修改!

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

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

相關文章

HarmonyOS 應用模塊化設計 - 面試核心知識點

HarmonyOS 應用模塊化設計 - 面試核心知識點 在 HarmonyOS 開發面試中&#xff0c;模塊化設計是必考知識點。本文從面試官角度深度解析 HarmonyOS 應用模塊化設計&#xff0c;涵蓋 HAP、HAR、HSP 等核心概念&#xff0c;助你輕松應對技術面試&#xff01; &#x1f3af; 面試高…

Maven高級學習筆記

分模塊設計 為什么分模塊設計?將項目按照功能拆分成若干個子模塊&#xff0c;方便項目的管理維護、擴展&#xff0c;也方便模塊間的相互調用&#xff0c;資源共享。 注意事項&#xff1a;分模塊開發需要先針對模塊功能進行設計&#xff0c;再進行編碼。不會先將工程開發完畢&…

[創業之路-423]:經濟學 - 大國競爭格局下的多維博弈與科技核心地位

在當今風云變幻的國際舞臺上&#xff0c;大國競爭已成為時代的主旋律&#xff0c;其激烈程度與復雜性遠超以往。這場全方位的較量&#xff0c;涵蓋了制度、思想、文化、經濟、科技、軍事等諸多關鍵領域&#xff0c;每一個維度都深刻影響著大國的興衰成敗&#xff0c;而科技在其…

【企業容災災備系統規劃】

一、企業災備體系 1.1 災備體系 災備切換的困境: 容災領域的標準化方法和流程、算法體系是確保業務連續性和數據可靠性的核心,以下從標準框架、流程規范、算法體系三個維度進行系統分析: 1.1.1、標準化方法體系? ?1. 容災等級標準? ?國際標準SHARE78?: 將容災能力劃…

Kafka Connect基礎入門與核心概念

一、Kafka Connect是什么&#xff1f; Apache Kafka Connect是Kafka生態中用于構建可擴展、可靠的數據集成管道的組件&#xff0c;它允許用戶將數據從外部系統&#xff08;如數據庫、文件系統、API等&#xff09;導入Kafka&#xff08;Source Connector&#xff09;&#xff0…

從零手寫Java版本的LSM Tree (四):SSTable 磁盤存儲

&#x1f525; 推薦一個高質量的Java LSM Tree開源項目&#xff01; https://github.com/brianxiadong/java-lsm-tree java-lsm-tree 是一個從零實現的Log-Structured Merge Tree&#xff0c;專為高并發寫入場景設計。 核心亮點&#xff1a; ? 極致性能&#xff1a;寫入速度超…

Kotlin的5個主要作用域函數

applay, also,let, run, with 是kotlin標準庫提供的5個主要的作用域函數&#xff08;Scope Functions&#xff09;?&#xff0c;它們的設計目的是為了在特定作用域內更簡潔地操作對象。 如何使用這5個函數&#xff0c;要從它的設計目的來區分&#xff1a; apply : 配置/對象…

原型模式Prototype Pattern

模式定義 用原型實例指定創建對象的種類&#xff0c;并且通過復制這些原型創建新的對象&#xff0c;其允許一個對象再創建 另外一個可定制的對象&#xff0c;無須知道任何創建的細節 對象創建型模式 基本工作原理是通過將一個原型對象傳給那個要發動創建的對象&#xff0c;這…

基于深度學習的智能交通流量預測系統:技術與實踐

前言 隨著城市化進程的加速&#xff0c;交通擁堵問題日益嚴重&#xff0c;給人們的日常生活和經濟發展帶來了巨大的挑戰。智能交通系統&#xff08;ITS&#xff09;作為解決交通問題的重要手段&#xff0c;逐漸成為研究的熱點。其中&#xff0c;交通流量預測是智能交通系統中的…

Cilium動手實驗室: 精通之旅---23.Advanced Gateway API Use Cases

Cilium動手實驗室: 精通之旅---23.Advanced Gateway API Use Cases 1. Lab說明1.1 高級網關 API 使用案例 2. 負載均衡器2.1 部署應用程序2.2 部署 Gateway 和 HTTPRoute 3. HTTP 標頭請求修飾符3.1 部署 HTTPRoute3.2 可觀測性 4. HTTP 響應標頭重寫5. HTTP 流量鏡像5.1 demo應…

Agentic Workflow是什么?Agentic Workflow會成為下一個AI風口嗎?

無論是想要學習人工智能當做主業營收&#xff0c;還是像我一樣作為開發工程師但依然要運用這個顛覆開發的時代寵兒&#xff0c;都有必要了解、學習一下人工智能。 近期發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;入行門檻低&#x…

Some chunks are larger than 500 KiB after minification. Consider

在 vue3vite 項目開發中&#xff0c;build 打包時出現以下警告報錯&#xff1a; (!) Some chunks are larger than 500 KiB after minification. Consider: - Using dynamic import() to code-split the application - Use build.rollupOptions.output.manualChunks to improve…

NodeJS11和10以及之前的版本,關鍵差異?

Node.js 11 相比 10&#xff08;及更早版本&#xff09;&#xff0c;除了事件循環行為的重大改變&#xff0c;還有多個核心模塊和底層機制的升級。以下是它們的關鍵差異和新特性對比&#xff0c;幫助你快速掌握兩個版本的重要變化。 &#x1f527; 一、事件循環行為變化&#x…

調和級數 斂散性

調和級數的斂散性是一個非常經典的問題。我們來全面分析它。 &#x1f9e0; 調和級數定義 調和級數是指&#xff1a; ∑ n 1 ∞ 1 n 1 1 2 1 3 1 4 ? \sum_{n1}^{\infty} \frac{1}{n} 1 \frac{1}{2} \frac{1}{3} \frac{1}{4} \cdots n1∑∞?n1?121?31?41?? …

Python?元組集合字符串

????˙?˙? ? 元組&#x1f6e5;?創建訪問修改解包其他操作比較的依據 集合&#x1f6f8;創建添加和刪除其他操作 字符串&#x1fa82;創建索引和切片基本操作連接加號join() 重復查找in 關鍵字index()find()startswith()endswith() ??替換??分割??大小寫刪除 能…

??信息系統項目管理師-項目整合管理 知識點總結與例題分析??

??一、項目整合管理概述?? ??1. 定義與重要性?? 項目整合管理是項目管理知識領域中的核心過程,它協調所有其他知識領域的過程和活動,確保項目各要素有效整合。其核心目標是: ??統一項目目標??:確保各要素服務于共同目標??協調沖突??:解決項目執行中的各…

『uniapp』onThemeChange監聽主題樣式,動態主題不正確生效,樣式被覆蓋的坑

目錄 問題示例代碼解決思路1&#xff08;缺點影響顯示效果有延遲&#xff09;解決思路2——通過路由刷新頁面&#xff08;缺點只適用于部分網頁&#xff09;解決思路3——vuex&#xff08;沒學會~&#xff09;總結 歡迎關注 『uniapp』 專欄&#xff0c;持續更新中 歡迎關注 『…

LeetCode 高頻 SQL 50 題(基礎版)【題解】合集

點擊下方標題可跳轉至對應部分&#xff1a; LeetCode 高頻 SQL 50 題&#xff08;基礎版&#xff09;之 【查詢】部分 LeetCode 高頻 SQL 50 題&#xff08;基礎版&#xff09;之 【連接】部分 上 LeetCode 高頻 SQL 50 題&#xff08;基礎版&#xff09;之 【連接】部分 下…

Jenkins 全面深入學習目錄

Jenkins 全面深入學習目錄 第一部分&#xff1a;Jenkins 基礎入門 Jenkins 概述 持續集成/持續交付(CI/CD)概念Jenkins 的歷史與發展Jenkins 與其他 CI/CD 工具的比較 Jenkins 安裝與配置 系統要求與環境準備不同操作系統下的安裝方法初始配置與安全設置插件管理系統 Jenkins…

安裝laravel11和laravel12的一些報錯問題解決

前言 今天在安裝laravel的過程中遇到一些報錯問題&#xff0c;記錄一下。 laravel 12 Root composer.json requires laravel/tinker ^2.10.1, found laravel/tinker[2.x-dev] but it does not match your minimum-stability laravel/framework[v12.0.0, ..., v12.15.0] requ…