Vue OptionsAPI與CompositionAPI的區(qū)別與使用介紹
OptionsAPI與CompositionAPI在代碼使用和邏輯上的區(qū)別
一、代碼使用方面的區(qū)別
(一)組件定義的結(jié)構(gòu)
- OptionsAPI
- 以對象字面量的形式定義組件,對象包含多個(gè)屬性,每個(gè)屬性對應(yīng)不同的功能。例如:
export default { data() { return { message: 'Hello, OptionsAPI' }; }, methods: { sayHello() { console.log(this.message); } }, mounted() { this.sayHello(); } };
- 這里
data
、methods
、mounted
等屬性分別定義了組件的數(shù)據(jù)、方法和生命周期鉤子等內(nèi)容,它們在一個(gè)大的對象結(jié)構(gòu)下相互獨(dú)立存在。 - CompositionAPI
- 使用
setup
函數(shù)作為組件邏輯的入口點(diǎn),在函數(shù)內(nèi)部定義各種邏輯并返回供模板使用的值。例如:
- 使用
import { ref } from 'vue'; export default { setup() { const message = ref('Hello, CompositionAPI'); const sayHello = () => { console.log(message.value); }; sayHello(); return { message, sayHello }; } };
- 在
setup
函數(shù)中,將響應(yīng)式數(shù)據(jù)(如ref
創(chuàng)建的數(shù)據(jù))、方法等邏輯緊湊地組合在一起,然后通過返回值將需要在模板中使用的數(shù)據(jù)和方法暴露出去。
(二)響應(yīng)式數(shù)據(jù)的定義與使用
OptionsAPI
- 在
data
函數(shù)中定義響應(yīng)式數(shù)據(jù)。例如:
export default { data() { return { count: 0 }; }, methods: { increment() { this.count++; } } };
- 響應(yīng)式數(shù)據(jù)通過
this
關(guān)鍵字在methods
、watch
等其他屬性中訪問和修改。這里的this
指向組件實(shí)例,這種方式在多層嵌套函數(shù)或回調(diào)函數(shù)中使用時(shí)可能會出現(xiàn)this
指向混淆的問題。- CompositionAPI
- 使用
ref
或reactive
函數(shù)來定義響應(yīng)式數(shù)據(jù)。 - 例如使用
ref
:
import { ref } from 'vue'; export default { setup() { const count = ref(0); const increment = () => { count.value++; }; return { count, increment }; } };
- 或者使用
reactive
(用于創(chuàng)建對象類型的響應(yīng)式數(shù)據(jù)):
import { reactive } from 'vue'; export default { setup() { const state = reactive({ count: 0 }); const increment = () => { state.count++; }; return { state, increment }; }; };
- 響應(yīng)式數(shù)據(jù)通過
value
屬性(ref
類型)或者直接操作對象屬性(reactive
類型)來進(jìn)行訪問和修改,避免了this
指向問題。
(三)邏輯復(fù)用的實(shí)現(xiàn)方式
- OptionsAPI
- 主要通過
mixins
來實(shí)現(xiàn)邏輯復(fù)用。例如,創(chuàng)建一個(gè)mixin
對象:
- 主要通過
const myMixin = { data() { return { sharedData: 'This is shared data' }; }, methods: { sharedMethod() { console.log('This is a shared method'); } } }; export default { mixins: [myMixin], // 組件自身的其他邏輯 data() { return { componentData: 'This is component - specific data' }; }, mounted() { this.sharedMethod(); } };
但是mixins
存在一些問題,如可能導(dǎo)致命名沖突(如果多個(gè)mixins
中有相同名稱的屬性或方法),并且在組件中使用時(shí),難以追蹤某個(gè)屬性或方法的來源。
- CompositionAPI
- 通過自定義組合函數(shù)來實(shí)現(xiàn)邏輯復(fù)用。
例如:
import { ref } from 'vue'; const useCounter = () => { const count = ref(0); const increment = () => { count.value++; }; return { count, increment }; }; export default { setup() { const { count, increment } = useCounter(); return { count, increment }; } };
- 自定義組合函數(shù)可以在多個(gè)組件中復(fù)用,代碼結(jié)構(gòu)清晰,易于理解和維護(hù)。
二、邏輯方面的區(qū)別
(一)邏輯內(nèi)聚性
- OptionsAPI
- 相關(guān)邏輯分散在不同的選項(xiàng)屬性中。例如,與一個(gè)數(shù)據(jù)相關(guān)的初始化邏輯可能在
data
中,對該數(shù)據(jù)的操作邏輯在methods
中,數(shù)據(jù)變化的監(jiān)聽邏輯在watch
中。這種分散的結(jié)構(gòu)使得在處理復(fù)雜功能時(shí),需要在多個(gè)屬性之間切換來理解完整的邏輯流程。
- 相關(guān)邏輯分散在不同的選項(xiàng)屬性中。例如,與一個(gè)數(shù)據(jù)相關(guān)的初始化邏輯可能在
- CompositionAPI
- 在
setup
函數(shù)中可以將相關(guān)邏輯組合在一起。例如,對于一個(gè)計(jì)數(shù)器功能,可以在setup
函數(shù)中同時(shí)定義響應(yīng)式數(shù)據(jù)、操作數(shù)據(jù)的方法以及相關(guān)的生命周期鉤子(如果需要),使得整個(gè)功能的邏輯更加內(nèi)聚,便于理解和維護(hù)。
- 在
(二)對Type - Script的支持邏輯
- OptionsAPI
- 在OptionsAPI中使用TypeScript時(shí),需要為每個(gè)選項(xiàng)屬性分別定義類型。例如,在
data
函數(shù)中定義的數(shù)據(jù)需要單獨(dú)定義類型,methods
中的方法也需要定義參數(shù)和返回值的類型等。這使得類型定義分散在整個(gè)組件定義中,代碼結(jié)構(gòu)相對復(fù)雜。 - 如下是一個(gè)使用TypeScript的OptionsAPI示例:
- 在OptionsAPI中使用TypeScript時(shí),需要為每個(gè)選項(xiàng)屬性分別定義類型。例如,在
export default { data(): { message: string; } { return { message: 'Hello' }; }, methods: { sayHello(): void { console.log(this.message); } } };
- CompositionAPI
- 由于以函數(shù)形式組織邏輯,在
setup
函數(shù)中可以更方便地進(jìn)行整體的類型定義??梢詫?code>setup函數(shù)的輸入?yún)?shù)和返回值進(jìn)行類型定義,并且在自定義組合函數(shù)中也能很好地定義類型。這種方式與TypeScript的函數(shù)類型系統(tǒng)結(jié)合得更加緊密,代碼的類型定義更加簡潔清晰。 - 例如:
- 由于以函數(shù)形式組織邏輯,在
import { ref } from 'vue'; const useCounter = (): { count: { value: number }; increment: () => void; } => { const count = ref(0); const increment = () => { count.value++; }; return { count, increment }; }; export default { setup(): { count: { value: number }; increment: () => void; } { const { count, increment } = useCounter(); return { count, increment }; } };
到此這篇關(guān)于Vue OptionsAPI與CompositionAPI的區(qū)別的文章就介紹到這了,更多相關(guān)Vue OptionsAPI與CompositionAPI內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue1.0和vue2.0的watch監(jiān)聽事件寫法詳解
今天小編就為大家分享一篇vue1.0和vue2.0的watch監(jiān)聽事件寫法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09vue3.0中使用Element-Plus中Select下的filter-method屬性代碼示例
這篇文章主要給大家介紹了關(guān)于vue3.0中使用Element-Plus中Select下的filter-method屬性的相關(guān)資料,Filter-method用法是指從一組數(shù)據(jù)中選擇滿足條件的項(xiàng),文中通過圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12vue中使用go()和back()兩種返回上一頁的區(qū)別說明
這篇文章主要介紹了vue中使用go()和back()兩種返回上一頁的區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07vue3+elementplus前端生成圖片驗(yàn)證碼完整代碼舉例
在開發(fā)過程中有時(shí)候需要使用圖片驗(yàn)證碼進(jìn)行增加安全強(qiáng)度,在點(diǎn)擊圖片時(shí)更新新的圖片驗(yàn)證碼,記錄此功能,以便后期使用,這篇文章主要給大家介紹了關(guān)于vue3+elementplus前端生成圖片驗(yàn)證碼的相關(guān)資料,需要的朋友可以參考下2024-03-03vue項(xiàng)目中使用ts(typescript)入門教程
最近項(xiàng)目需要將原vue項(xiàng)目結(jié)合ts的使用進(jìn)行改造,本文從安裝到vue組件編寫進(jìn)行了說明,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Vue3 Echarts通用的折線圖帶陰影效果實(shí)現(xiàn)
在環(huán)保倉管項(xiàng)目中,做了一個(gè)每月對藥品、消耗品、設(shè)備的進(jìn)出,進(jìn)行統(tǒng)計(jì)百分比,效果好看,后面經(jīng)常在用這個(gè)樣式,下面通過示例代碼分享Vue3 Echarts通用的折線圖帶陰影效果實(shí)現(xiàn),感興趣的朋友一起看看吧2024-07-07element-ui實(shí)現(xiàn)表格邊框的動態(tài)切換并防抖
這篇文章主要介紹了element-ui實(shí)現(xiàn)表格邊框的動態(tài)切換并防抖方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08vue+css如何實(shí)現(xiàn)圓環(huán)漸變儀表盤
這篇文章主要介紹了vue+css如何實(shí)現(xiàn)圓環(huán)漸變儀表盤問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08使用vue-print-nb打印el-table問題總結(jié)
這篇文章主要介紹了使用vue-print-nb打印el-table問題總結(jié),通過實(shí)例代碼介紹了vue-print-nb 打印功能,本文結(jié)合實(shí)例代碼講解的非常詳細(xì),感興趣的朋友一起看看吧2024-01-01