vue composition-api 封裝組合式函數(shù)的操作方法
介紹
在 Vue 應(yīng)用的概念中,“組合式函數(shù)”(Composables) 是一個(gè)利用 Vue 的組合式 API 來(lái)封裝和復(fù)用有狀態(tài)邏輯的函數(shù)。
Composables 函數(shù)就是利用 Vue3 提出的 Composition API ,封裝出的一些可以復(fù)用的組合式函數(shù),目前 Vue2 也可以使用(2.7 版本可以直接使用,2.6 需要引入另外composition-api的插件)。還沒(méi)寫過(guò)這種風(fēng)格代碼的同學(xué),可以先看引用的官方文檔的兩個(gè)鏈接,介紹的比較詳細(xì)。
下面我簡(jiǎn)單介紹一下: 組合式 API 的靈感來(lái)自Hooks,也是目前流行的函數(shù)式編程的思想,便于邏輯復(fù)用、測(cè)試以及類型推導(dǎo),編寫Vue業(yè)務(wù)代碼的時(shí)候會(huì)更加的靈活。但組合式 API 不等于函數(shù)式編程,組合式 API 的特點(diǎn)是基于Vue數(shù)據(jù)響應(yīng)系統(tǒng)的,而函數(shù)式編程通常強(qiáng)調(diào)數(shù)據(jù)不可變的。 組合式API 包括:
- 響應(yīng)式相關(guān)(ref、reactive、computed、watch 等)
- 生命周期鉤子(onMounted 和 onUnmounted 等)
- provide、inject 等
一個(gè)簡(jiǎn)單的組合式函數(shù)示例和使用:
import { computed } from 'vue'
export function useAdd(a,b) {
return computed(() => a.value + b.value)
}import { ref } from 'vue'
import { useAdd } from './add.js
const a = ref(1)
const b = ref(2)
const c = useAdd(a,b)最佳實(shí)踐
像寫工具函數(shù)一樣,組合式函數(shù)也要設(shè)計(jì)好函數(shù)的接口,設(shè)計(jì)函數(shù)入?yún)⒌念愋鸵约澳J(rèn)值和返回值是什么樣,以及后期的可擴(kuò)展性。
1. options對(duì)象化
編寫組合式函數(shù)時(shí)如果傳入一些配置參數(shù),可以把配置參數(shù)設(shè)計(jì)為 options 對(duì)象,好處就是不需要記住參數(shù)的位置,以及方便后期的擴(kuò)展,可通過(guò) TS 類型提示。如 Lodash 的防抖節(jié)流函數(shù),配置項(xiàng)也是放在 options 對(duì)象里的。 函數(shù)內(nèi)部實(shí)現(xiàn)通過(guò)解構(gòu)獲取 options 的配置項(xiàng),可以賦值默認(rèn)值
export function useTitle(newTitle = null, options = {}) {
const {
document = defaultDocument,
observe = false,
titleTemplate = '%s',
} = options
// ...
}2. 動(dòng)態(tài)返回
通過(guò) options 的配置項(xiàng),可以動(dòng)態(tài)返回不同的值
export default useNow(options) {
const { controls = false } = options;
// ...
if (!controls) {
return value;
} else {
return { value, controlAction1, controlAction2 };
}
}如:useNow vueuse.org/core/useNow…
import { useNow } from '@vueuse/core'
const now = useNow()
// 返回控制暫停/恢復(fù)的函數(shù)
const { now, pause, resume } = useNow({ controls: true })3. 靈活地使用ref
入?yún)⒃谑褂玫倪^(guò)程中可能是普通類型或 ref 類型:
type MaybeRef<T> = Ref<T> | T
如果函數(shù)內(nèi)部期待入?yún)⑹瞧胀愋停鞘褂谜呖赡軅魅腠憫?yīng)式的 Ref 類型,可以使用 unref 函數(shù)獲取值,兼容 ref類型:
import { unref } from 'vue'
function useFeature(maybeRef) {
const value = unref(maybeRef)
//...
}unref 的實(shí)現(xiàn):
function unref <T> (r:Ref<T>|T): T) {
return isRef(r) ? r.value : r
}如果函數(shù)內(nèi)部入?yún)⑹?ref 類型的,可以再使用 ref 函數(shù)包裹,該函數(shù)如果傳入一個(gè)ref類型的參數(shù)會(huì)原樣返回。
import { ref, watch } from 'vue'
export function useTitle(newTitle) {
const title = ref(newTitle || document.title)
watch(title, (t) => {
if (t != null) document.title = t},
{ immediate: true }
)
return title
}4. 異步變同步
通過(guò)響應(yīng)式數(shù)據(jù)的連接,不必使用await,在等待異步請(qǐng)求返回后將數(shù)據(jù)進(jìn)行更新。如:
const { res } = useFetch('https://xxx.com/').json()
const data = computed(() => res.value?.data)import { shallowRef } from 'vue'
export function useFetch<>(url) {
const data = shallowRef(null)
const error = shallowRef(null)
fetch(unref(url)).then(r => r.json())
.then(r => data.value = r)
.catch(e => error.value = e)
return {
data,
error
}
}5. 簡(jiǎn)單的狀態(tài)管理
由于響應(yīng)性系統(tǒng)與組件層是解耦的,簡(jiǎn)單的場(chǎng)景下我們可以使用 reactive 創(chuàng)建一個(gè)響應(yīng)式對(duì)象,在多個(gè)組件實(shí)例間共享數(shù)據(jù)。
// store.js
import { reactive } from 'vue'
export const store = reactive({
a: 0,
b: 1
})復(fù)雜場(chǎng)景則需要使用 pinia 進(jìn)行狀態(tài)管理
參考資料
到此這篇關(guān)于vue composition-api 封裝組合式函數(shù)的操作方法的文章就介紹到這了,更多相關(guān)vue composition-api 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 淺談Vue3.0新版API之composition-api入坑指南
- Vue3 composition API實(shí)現(xiàn)邏輯復(fù)用的方法
- Vue3 Composition API的使用簡(jiǎn)介
- 詳解Vue3 Composition API中的提取和重用邏輯
- vue3.0 的 Composition API 的使用示例
- Vue3中Composition?API和Options?API的區(qū)別
- 詳解vue3.0 的 Composition API 的一種使用方法
- Vue2如何支持composition API示例詳解
- Vue OptionsAPI與CompositionAPI的區(qū)別與使用介紹
- Vue3中使用Composition API管理組件狀態(tài)
相關(guān)文章
vue-i18n使用$t導(dǎo)致的Typescript報(bào)錯(cuò)問(wèn)題及解決
在Vue3項(xiàng)目中使用vue-i18n?v9.14.0時(shí),$t屬性可能因類型未聲明導(dǎo)致TS報(bào)錯(cuò),解決方案是創(chuàng)建src/vue-i18n.d.ts文件,添加至tsconfig.json的include項(xiàng)中,聲明$t屬性類型2025-08-08
非Vuex實(shí)現(xiàn)的登錄狀態(tài)判斷封裝實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于非Vuex實(shí)現(xiàn)的登錄狀態(tài)判斷封裝的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02
詳解在vue使用weixin-js-sdk常見(jiàn)使用方法
這篇文章主要介紹了 詳解在vue使用weixin-js-sdk常見(jiàn)使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
vue和uniapp頁(yè)面實(shí)現(xiàn)自動(dòng)滾動(dòng)到最底部
這篇文章主要介紹了vue和uniapp頁(yè)面實(shí)現(xiàn)自動(dòng)滾動(dòng)到最底部方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
Vue結(jié)合echarts實(shí)現(xiàn)繪制水滴圖
這篇文章主要為大家詳細(xì)介紹了Vue如何結(jié)合echarts實(shí)現(xiàn)水滴圖的繪制,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-07-07
element-ui中this.$confirm提示文字中部分有顏色自定義方法
this.$confirm是一個(gè)Vue.js中的彈窗組件,其樣式可以通過(guò)CSS進(jìn)行自定義,下面這篇文章主要給大家介紹了關(guān)于element-ui中this.$confirm提示文字中部分有顏色的自定義方法,需要的朋友可以參考下2024-02-02

