Composition Api封裝業(yè)務(wù)hook思路示例分享
前序
近期公司的新項(xiàng)目一個(gè)小程序,一直想嘗試 Vue3 開(kāi)發(fā)項(xiàng)目,苦于自己的驅(qū)動(dòng)力不行,學(xué)的零零碎碎的。因此小程序我直接跟項(xiàng)目組長(zhǎng)說(shuō)我要使用 uniapp 的 Vue3 版進(jìn)行開(kāi)發(fā)。開(kāi)發(fā)中遇到業(yè)務(wù)場(chǎng)景相同的,就分裝了一個(gè)hook 來(lái)減少代碼,易于維護(hù)。
hook的場(chǎng)景
這種獲取列表的需求很常見(jiàn)吧,在我這個(gè)小程序中有3處使用到了獲取列表的功能。分別是: 我的收藏、已投遞崗位、未投遞崗位。
當(dāng)然展示崗位的 card 我是分裝了一個(gè)組件,很簡(jiǎn)單的業(yè)務(wù)組件,這里也不會(huì)描述。
假如: 我的收藏、已投遞崗位、未投遞崗位 都各自獲取列表,就會(huì)出現(xiàn)重復(fù)性的定義以下代碼
const getJobParameter = reactive<paramsType>({ page: 1, pageSize: 10, code: null, releaseJobName: null, }); const jobList = ref([] as Array<jobType>); const total = ref(0); onLoad(() => { getlist(); }); onReachBottom(() => { if (jobList.value.length < total.value) { getJobParameter.page++; getlist(); } }); async function getlist() { const res: any = await fn(getJobParameter); jobList.value = await [...jobList.value, ...res.data.data.dataList]; total.value = res.data.data.total; }
3個(gè)頁(yè)面都要寫(xiě)上: 定義變量 -> 初始獲取 -> 獲取的代碼判斷 -> 底部觸發(fā)的代碼。因此就直接分裝了一個(gè) hook。
useGetJobList
共同
import { onLoad, onReachBottom } from '@dcloudio/uni-app'; import { ref, reactive } from 'vue'; import { jobType } from '@/types/job-hunting'; interface paramsType { page: number; pageSize: number; code: string | null; releaseJobName: string | null; } export function useGetJobList(fn) { const getJobParameter = reactive<paramsType>({ page: 1, pageSize: 10, code: null, releaseJobName: null, }); const jobList = ref([] as Array<jobType>); const total = ref(0); onLoad(() => { getlist(); }); onReachBottom(() => { if (jobList.value.length < total.value) { getJobParameter.page++; getlist(); } }); async function getlist() { const res: any = await fn(getJobParameter); jobList.value = await [...jobList.value, ...res.data.data.dataList]; total.value = res.data.data.total; } async function refresh() { getJobParameter.page = 1; jobList.value = []; await getlist(); return true; } return { jobList, refresh: () => refresh(), }; }
已上代碼就是簡(jiǎn)單的獲取到崗位的 list 還未進(jìn)行操作。
思路歷程
因?yàn)槭醉?yè)有城市的選擇、崗位的搜索等功能。
下面是我開(kāi)始時(shí)的想法(錯(cuò)誤):
我想著要不把 getJobParameter 的參數(shù)全部暴露出去,然后對(duì)這些參數(shù)進(jìn)行操作,但是內(nèi)心感覺(jué)怪怪的,這樣跟不分裝好像區(qū)別也不大,又思考要不在 useGetJobList 加一個(gè)參數(shù)用來(lái)傳遞 參數(shù)的變化,當(dāng)然這個(gè)也是行不通的。
后面看了別人分裝的 hook。就有了以下代碼。
import { onLoad, onReachBottom } from '@dcloudio/uni-app'; import { ref, reactive } from 'vue'; import { jobType } from '@/types/job-hunting'; interface paramsType { page: number; pageSize: number; code: string | null; releaseJobName: string | null; } export function useGetJobList(fn) { const getJobParameter = reactive<paramsType>({ page: 1, pageSize: 10, code: null, releaseJobName: null, }); const jobList = ref([] as Array<jobType>); const total = ref(0); onLoad(() => { getlist(); }); onReachBottom(() => { if (jobList.value.length < total.value) { getJobParameter.page++; getlist(); } }); async function getlist() { const res: any = await fn(getJobParameter); jobList.value = await [...jobList.value, ...res.data.data.dataList]; total.value = res.data.data.total; } async function refresh() { getJobParameter.page = 1; jobList.value = []; await getlist(); // 這個(gè)后面的代表異步了 return true; } function reset () { getJobParameter.page = 1; getJobParameter.code = null; getJobParameter.releaseJobName = null; } function queryList(searchValue: string | null) { reset(); getJobParameter.releaseJobName = searchValue; getlist(); } function codeChange(code: string | null) { reset(); getJobParameter.code = code; getlist(); } return { jobList, queryList: (searchValue: string | null) => queryList(searchValue), codeChange: (code: string | null) => codeChange(code), refresh: () => refresh(), }; }
這里為 重新定兩個(gè)函數(shù) 分別是 queryList、codeChange,用來(lái)搜索和城市code 改變?cè)佾@取 崗位列表。
queryList: (searchValue: string | null) => queryList(searchValue), codeChange: (code: string | null) => codeChange(code),
上面代碼還有一個(gè)心得,就是在 return 是可以直接把函數(shù)寫(xiě)為什么要再分裝一個(gè)函數(shù)出來(lái)?
心得
- 當(dāng)定義了一個(gè) hook , 當(dāng)外部使用想改變 hook 內(nèi)部的變量,內(nèi)部寫(xiě)個(gè)函數(shù)暴露出去,函數(shù)的內(nèi)部是對(duì)變量的修改,外部只需要使用暴露函數(shù)。這樣代碼十分的清晰易懂。
- return 再分裝一個(gè)函數(shù) 是為了后期別人看代碼是可以一眼就知道返回哪些是變量,哪些是函數(shù),函數(shù)有哪些參數(shù),參數(shù)的類型等之類的,不用一個(gè)的去查找。
utils 和 hook 的區(qū)別
之前我一直搞不清楚 hook 和 utils 的區(qū)別,我感覺(jué)差不多都是分裝一個(gè)函數(shù)出來(lái)。
區(qū)別: utils 是一個(gè)簡(jiǎn)單的參數(shù)傳入,然后返回,返回的變量不具有響應(yīng)式。沒(méi)有使用到 Vue 的 reactive、ref等鉤子函數(shù), 我認(rèn)為當(dāng)你使用了這些鉤子函數(shù)就可以說(shuō)它是一個(gè) hook。
總結(jié)
hook 有點(diǎn)想面向?qū)ο蟮恼Z(yǔ)言的 class, 內(nèi)部定義的變量,最好自己內(nèi)部的做處理,只需暴露出一個(gè)函數(shù)。
- 當(dāng)定義了一個(gè) hook , 當(dāng)外部使用想改變 hook 內(nèi)部的變量就因此寫(xiě)一個(gè)函數(shù)暴露出去,進(jìn)行變量的更改
- return 再分裝一個(gè)函數(shù) 是為了后期別人看代碼是可以一眼就知道返回哪些是變量,哪些是函數(shù),函數(shù)有哪些參數(shù),參數(shù)的類型等之類的,不用一個(gè)的去查找。
以上就是Composition Api封裝業(yè)務(wù)hook思路示例分享的詳細(xì)內(nèi)容,更多關(guān)于Composition Api封裝hook的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue.js集成echarts時(shí)遇到的一些問(wèn)題總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于vue.js集成echarts遇到的一些問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04vue控制多行文字展開(kāi)收起的實(shí)現(xiàn)示例
這篇文章主要介紹了vue控制多行文字展開(kāi)收起的實(shí)現(xiàn)示例(也叫控制文字展開(kāi)隱藏),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10vue3中$attrs的變化與inheritAttrs的使用詳解
$attrs現(xiàn)在包括class和style屬性。?也就是說(shuō)在vue3中$listeners不存在了,vue2中$listeners是單獨(dú)存在的,在vue3?$attrs包括class和style屬性,?vue2中?$attrs?不包含class和style屬性,這篇文章主要介紹了vue3中$attrs的變化與inheritAttrs的使用?,需要的朋友可以參考下2022-10-10解決vue-cli webpack打包后加載資源的路徑問(wèn)題
今天小編就為大家分享一篇解決vue-cli webpack打包后加載資源的路徑問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09vue 組件中使用 transition 和 transition-group實(shí)現(xiàn)過(guò)渡動(dòng)畫(huà)
本文給大家分享一下vue 組件中使用 transition 和 transition-group 設(shè)置過(guò)渡動(dòng)畫(huà),總結(jié)來(lái)說(shuō)可分為分為 name 版, js 鉤子操作類名版, js 鉤子操作行內(nèi)樣式版,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-07-07