最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Composition Api封裝業(yè)務(wù)hook思路示例分享

 更新時(shí)間:2022年07月11日 15:32:16   作者:曉欲望  
這篇文章主要為大家介紹了Composition Api封裝業(yè)務(wù)hook的思路示例分享,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前序

近期公司的新項(xiàng)目一個(gè)小程序,一直想嘗試 Vue3 開發(fā)項(xiàng)目,苦于自己的驅(qū)動(dòng)力不行,學(xué)的零零碎碎的。因此小程序我直接跟項(xiàng)目組長(zhǎng)說(shuō)我要使用 uniapp 的 Vue3 版進(jìn)行開發(fā)。開發(fā)中遇到業(yè)務(wù)場(chǎng)景相同的,就分裝了一個(gè)hook 來(lái)減少代碼,易于維護(hù)。

hook的場(chǎng)景

這種獲取列表的需求很常見吧,在我這個(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è)面都要寫上: 定義變量 -> 初始獲取 -> 獲取的代碼判斷 -> 底部觸發(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è)有城市的選擇、崗位的搜索等功能。

下面是我開始時(shí)的想法(錯(cuò)誤):

我想著要不把 getJobParameter 的參數(shù)全部暴露出去,然后對(duì)這些參數(shù)進(jìn)行操作,但是內(nèi)心感覺怪怪的,這樣跟不分裝好像區(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ù)寫為什么要再分裝一個(gè)函數(shù)出來(lái)?

心得

  • 當(dāng)定義了一個(gè) hook , 當(dāng)外部使用想改變 hook 內(nèi)部的變量,內(nèi)部寫個(gè)函數(shù)暴露出去,函數(shù)的內(nèi)部是對(duì)變量的修改,外部只需要使用暴露函數(shù)。這樣代碼十分的清晰易懂。
  • return 再分裝一個(gè)函數(shù) 是為了后期別人看代碼是可以一眼就知道返回哪些是變量,哪些是函數(shù),函數(shù)有哪些參數(shù),參數(shù)的類型等之類的,不用一個(gè)的去查找。

utils 和 hook 的區(qū)別

之前我一直搞不清楚 hook 和 utils 的區(qū)別,我感覺差不多都是分裝一個(gè)函數(shù)出來(lái)。

區(qū)別: utils 是一個(gè)簡(jiǎn)單的參數(shù)傳入,然后返回,返回的變量不具有響應(yīng)式。沒有使用到 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)部的變量就因此寫一個(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中插槽slot的使用方法

    淺談Vue中插槽slot的使用方法

    這篇文章主要給大家分享了 Vue中插槽slot的使用方法,下面文章內(nèi)容圍繞插槽slot的相關(guān)資料展開其的使用方法,需要的朋友可以參考一下,希望多大家有所幫助
    2021-11-11
  • Vue-router 報(bào)錯(cuò)NavigationDuplicated的解決方法

    Vue-router 報(bào)錯(cuò)NavigationDuplicated的解決方法

    這篇文章主要介紹了Vue-router 報(bào)錯(cuò)NavigationDuplicated的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • vue+Element實(shí)現(xiàn)登錄隨機(jī)驗(yàn)證碼

    vue+Element實(shí)現(xiàn)登錄隨機(jī)驗(yàn)證碼

    這篇文章主要為大家詳細(xì)介紹了vue+Element實(shí)現(xiàn)登錄隨機(jī)驗(yàn)證碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue使用自定義指令實(shí)現(xiàn)一鍵復(fù)制功能

    vue使用自定義指令實(shí)現(xiàn)一鍵復(fù)制功能

    在Vue中,通過自定義指令v-copy和document.execCommand方法,可以實(shí)現(xiàn)點(diǎn)擊按鈕復(fù)制內(nèi)容到剪貼板的功能,適用于處理長(zhǎng)文本或多行文本的復(fù)制需求,而readonly屬性可避免內(nèi)容被修改和移動(dòng)設(shè)備上的虛擬鍵盤干擾,感興趣的朋友一起看看吧
    2024-09-09
  • vue實(shí)現(xiàn)登錄功能

    vue實(shí)現(xiàn)登錄功能

    這篇文章主要介紹了vue實(shí)現(xiàn)登錄功能的步驟,幫助大家更好的理解和使用vue框架,感興趣的朋友可以了解下
    2020-12-12
  • vue router動(dòng)態(tài)路由設(shè)置參數(shù)可選問題

    vue router動(dòng)態(tài)路由設(shè)置參數(shù)可選問題

    這篇文章主要介紹了vue-router動(dòng)態(tài)路由設(shè)置參數(shù)可選,文中給大家提到了vue-router 動(dòng)態(tài)添加 路由的方法,需要的朋友可以參考下
    2019-08-08
  • Vue Element前端應(yīng)用開發(fā)之前端API接口的封裝

    Vue Element前端應(yīng)用開發(fā)之前端API接口的封裝

    對(duì)整個(gè)系統(tǒng)來(lái)說(shuō),一般會(huì)有很多業(yè)務(wù)對(duì)象,而每個(gè)業(yè)務(wù)對(duì)象的API接口又有很多。我們這個(gè)VUE+Element 前端應(yīng)用就是針對(duì)ABP框架的業(yè)務(wù)對(duì)象,因此前端的業(yè)務(wù)對(duì)象接口也是比較統(tǒng)一的,那么可以考慮在前端中對(duì)后端API接口調(diào)用進(jìn)行封裝,引入ES6的方式進(jìn)行前端API的抽象簡(jiǎn)化。
    2021-05-05
  • vue實(shí)現(xiàn)跨域的方法分析

    vue實(shí)現(xiàn)跨域的方法分析

    這篇文章主要介紹了vue實(shí)現(xiàn)跨域的方法,結(jié)合實(shí)例形式分析了vue.js跨域的原理與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-05-05
  • van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù)

    van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù)

    前端開發(fā)想省時(shí)間就是要找框架呀,下面這篇文章主要給大家介紹了關(guān)于van-uploader保存文件到后端回顯后端接口返回的數(shù)據(jù),文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • vue Tooltip提示動(dòng)態(tài)換行問題

    vue Tooltip提示動(dòng)態(tài)換行問題

    這篇文章主要介紹了vue Tooltip提示動(dòng)態(tài)換行問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評(píng)論

铜鼓县| 雅安市| 桃源县| 时尚| 万荣县| 佛冈县| 高邮市| 永兴县| 双牌县| 濮阳县| 永吉县| 宁夏| 克拉玛依市| 民权县| 岢岚县| 舞钢市| 孟州市| 芷江| 盐源县| 宿松县| 乌兰浩特市| 蚌埠市| 金塔县| 柘荣县| 普安县| 双城市| 民县| 鹤岗市| 巫山县| 长宁县| 达州市| 武穴市| 瑞安市| 美姑县| 天长市| 闽侯县| 锡林浩特市| 通山县| 苏尼特右旗| 宜黄县| 河津市|