Vue3 組合式函數(shù)Composable最佳實戰(zhàn)
引言
截至目前,Composable(組合式函數(shù))應該是在VUE 3應用程序中組織業(yè)務邏輯最佳的方法。
它讓我們可以把一些小塊的通用邏輯進行抽離、復用,使我們的代碼更易于編寫、閱讀和維護。
由于這種編寫VUE代碼的方式相對較新,因此您可能想知道編寫組合式函數(shù)的最佳實踐是什么呢?本系列教程可以作為您和您的團隊在進行組合式開發(fā)過程中的參考指南。
我們將涵蓋以下內(nèi)容:
- 1.如何通過選項對象參數(shù)使您的組合更加可配置; ?? 本篇主題
- 2.使用ref和unref使我們的參數(shù)更加靈活;
- 3.如何使你的返回值更有用;
- 4.為什么從接口定義開始可以使你的組合式函數(shù)更強大;
- 5.如何使用異步代碼而無需“等待” - 使您的代碼更易于理解;
不過,首先,我們需要確保我們對組合式函數(shù)的理解是一致的。我們先花點時間解釋一下什么是組合式函數(shù)。
什么是Composable-組合式函數(shù)?
根據(jù)官方文檔說明,在 Vue 應用的概念中,“組合式函數(shù)”是一個利用 Vue 組合式 API 來封裝和復用有狀態(tài)邏輯的函數(shù)。
這就意味著,任何有狀態(tài)邏輯,并且使用了響應式處理的邏輯都可以轉換成組合式函數(shù)。這和我們平時抽離封裝的公共方法還是有一些區(qū)別的。我們封裝的公共方法往往是無狀態(tài)的:它在接收一些輸入后立刻返回所期望的輸出。而組合式函數(shù)往往是和狀態(tài)邏輯關聯(lián)的。
讓我們看看官方給出的useMouse這個組合式函數(shù):
import { ref, onMounted, onUnmounted } from 'vue'
// 按照慣例,組合式函數(shù)名以“use”開頭
export function useMouse() {
// 被組合式函數(shù)封裝和管理的狀態(tài)
const x = ref(0)
const y = ref(0)
// 組合式函數(shù)可以隨時更改其狀態(tài)。
function update(event) {
x.value = event.pageX
y.value = event.pageY
}
// 一個組合式函數(shù)也可以掛靠在所屬組件的生命周期上
// 來啟動和卸載副作用
onMounted(() => window.addEventListener('mousemove', update))
onUnmounted(() => window.removeEventListener('mousemove', update))
// 通過返回值暴露所管理的狀態(tài)
return { x, y }
}我們把狀態(tài)定義為refs,當鼠標移動的時候我們更新這個狀態(tài)。通過返回x和y,我們可以在任何組件中使用它們,甚至我們還可以把多個組合式函數(shù)嵌套使用。
當我們在組件中使用時
<template>
X: {{ x }} Y: {{ y }}
</template>
<script setup>
import { useMouse } from './useMouse';
const { x, y } = useMouse();
</script>如您所見,通過使用useMouse我們可以輕松的復用這個邏輯。僅僅很少的代碼,我們就可以在組件中獲取鼠標坐標狀態(tài)。
現(xiàn)在我們對組合式函數(shù)有了相同的認識,讓我們看一下可以幫助我們編寫更好的組合式函數(shù)的第一個方法吧。
選項對象參數(shù)
大部分組合式函數(shù)都會有一個或兩個必須的參數(shù),然后有一系列可選的參數(shù)來幫助進行一些額外的配置。在配置組合式函數(shù)時,我們可以將一系列的可選配置放到一個選項對象參數(shù)中,而不是一長串參數(shù)的形式。
// 使用選項對象參數(shù)形式
const title = useTitle('A new title', { titleTemplate: '>> %s <<' });
// Title is now ">> A new title <<"
// 使用多參數(shù)形式
const title = useTitle('A new title', '>> %s <<');
// Title is now ">> A new title <<"選項對象參數(shù)的形式可以給我們帶來一些便利:
- 首先,我們不必記住參數(shù)的正確順序,特別是參數(shù)很多的時候。雖然現(xiàn)在我們可以通過Typescript和編輯器提示功能來避免這類問題,但是通過這種方式仍然是有差別的。使用Javascript對象,參數(shù)的順序就不那么重要了。(當然,這也要求我們的函數(shù)定義需要清晰明了,我們后面會談)
- 其次,代碼更可讀取,因為我們知道該選項的作用是什么。
- 第三,代碼擴展性更好,以后添加新的選項要容易得多。這既適用于為組合式函數(shù)本身添加新選項,又適用于嵌套使用時參數(shù)傳遞。
因此,使用對象參數(shù)更加友好,但是我們該如何來實現(xiàn)呢?
在組合式函數(shù)中的實現(xiàn)
現(xiàn)在讓我們看下如何在組合式函數(shù)中使用選項對象參數(shù)。我們來給上面的useMouse進行一些擴展:
export function useMouse(options) {
const {
asArray = false,
throttle = false,
} = options;
// ...
};useMouse本身沒有必傳參數(shù),所以我們直接給它增加一個options參數(shù)來進行一些額外的配置。通過解構,我們可以訪問所有的選傳參數(shù),并且為每個參數(shù)設置了默認值,這就避免了有些不需要額外配置的調(diào)用時沒有傳入可選參數(shù)的情況。
現(xiàn)在讓我們來看兩個VueUse上面的組合式函數(shù)是如何使用這個模式的。VueUse是一個服務于Vue3的組合式函數(shù)的常用工具集,它的初衷就是將一切原本并不支持響應式的JS API變得支持響應式,省去程序員自己寫相關代碼。
我們先來看useTitle,然后再看一下useRefHistory是如何實現(xiàn)的。
舉例-useTitle
useTitle的作用非常簡單,就是用來更新頁面的標題。
const title = useTitle('Initial Page Title');
// Title: "Initial Page Title"
title.value = 'New Page Title';
// Title: "New Page Title"它也有幾個選擇參數(shù),來促進額外的靈活性。我們可以傳入titleTemplate作為模版,并且通過observe來將其設置稱為具備觀察性(內(nèi)部通過MutationObserver實現(xiàn)):
const title = useTitle('Initial Page Title', {
titleTemplate: '>> %s <<',
observe: true,
});
// Title: ">> Initial Page Title <<"
title.value = 'New Page Title';
// Title: ">> New Page Title <<"當我們查看它的源碼的時候可以看到以下處理
export function useTitle(newTitle, options) {
const {
document = defaultDocument,
observe = false,
titleTemplate = '%s',
} = options;
// ...
}useTitle包含一個必傳的參數(shù),以及一個可選參數(shù)對象。正如我們上面描述的那樣,它完全是按照這個模式來實現(xiàn)的。
接下來,讓我們看一下一個更復雜的組合式函數(shù)是如何使用選項對象模式的。
舉例-useRefHistory
useRefHistory可以幫助我們追蹤一個響應式變量的所有更改,可以讓我們輕松的執(zhí)行撤銷和恢復的操作。
// Set up the count ref and track it
const count = ref(0);
const { undo } = useRefHistory(count);
// Increment the count
count.value++;
// Log out the count, undo, and log again
console.log(counter.value); // 1
undo();
console.log(counter.value); // 0它支持設置許多不同的配置選擇
{
deep: false,
flush: 'pre',
capacity: -1,
clone: false,
// ...
}如果想知道這些選項參數(shù)的完整列表和對應的功能,可以去查看相關文檔,在此不再贅述。
我們可以將選項對象作為第二個參數(shù)傳遞,以進一步配置該組合函數(shù)的行為,與我們上一個示例相同:
export function useRefHistory(source, options) {
const {
deep = false,
flush = 'pre',
eventFilter,
} = options;
// ...
}我們可以看到它內(nèi)部僅僅解構出了一部分參數(shù)值,這是因為useRefHistory內(nèi)部依賴了useManualHistory這個組合式函數(shù),其他的選項參數(shù)將在后面透傳給useManualHistory時進行展開合并。
// ...
const manualHistory = useManualRefHistory(
source,
{
// Pass along the options object to another composable
...options,
clone: options.clone || deep,
setSource,
},
);
// ...這也和我們前面說到的內(nèi)容相符:組合式函數(shù)可以嵌套使用。
小結
本文是“組合式函數(shù)最佳實踐”的第一部分。我們研究了如何通過選項對象參數(shù)提升組合式函數(shù)的靈活性。無須擔心參數(shù)順序不對導致的問題,并且可以靈活進行配置項的增加擴展。我們不僅僅研究了這個模式本身,我們還通過VueUse中的useTitle和useRefHistory來學習了如何實現(xiàn)此模式。它們略有不同,但是這個模式本身就是很簡單的,我們通過它能做到也是有限的。
下一篇我們將介紹如何通過ref和unref使我們的參數(shù)更加靈活
// Works if we give it a ref we already have const countRef = ref(2); useCount(countRef); // Also works if we give it just a number const countRef = useRef(2);
這增加了靈活性,使我們能夠在應用程序中的更多情況下使用我們的組合。
以上就是Vue3 組合式函數(shù)Composable最佳實戰(zhàn)的詳細內(nèi)容,更多關于Vue3 Composable的資料請關注腳本之家其它相關文章!
相關文章
vue-seamless-scroll 實現(xiàn)簡單自動無縫滾動且添加對應點擊事件的簡單整理
vue-seamless-scroll是一個基于Vue.js的簡單無縫滾動組件, 基于requestAnimationFrame實現(xiàn),配置多滿足多樣需求,目前支持上下左右無縫滾動,單步滾動,及支持水平方向的手動切換功能,本節(jié)介紹,vue添加 vue-seamless-scroll實現(xiàn)自動無縫滾動的效果,并對應添加點擊事件2023-01-01
vue 實現(xiàn)左右拖拽元素并且不超過他的父元素的寬度
這篇文章主要介紹了vue 實現(xiàn)左右拖拽元素并且不超過他的父元素的寬度,需要的朋友可以參考下2018-11-11
Vue?keepAlive實現(xiàn)不同的路由共用一個組件component的緩存問題(推薦)
這篇文章主要介紹了Vue?keepAlive實現(xiàn)不同的路由共用一個組件component的緩存問題,實現(xiàn)方式使用Vue?keepAlive實現(xiàn)頁面緩存,需要的朋友可以參考下2022-08-08
VUE中setTimeout和setInterval自動銷毀案例
這篇文章主要介紹了VUE中setTimeout和setInterval自動銷毀案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Vue中nprogress頁面加載進度條的方法實現(xiàn)
這篇文章主要介紹了Vue中nprogress頁面加載進度條的方法實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11

