欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前序

近期公司的新項(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é)

    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-04
  • vue控制多行文字展開(kāi)收起的實(shí)現(xiàn)示例

    vue控制多行文字展開(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-10
  • vue3中$attrs的變化與inheritAttrs的使用詳解

    vue3中$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的三種路由模式總結(jié)

    Vue的三種路由模式總結(jié)

    這篇文章主要介紹了Vue的三種路由模式總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 解決vue-cli webpack打包后加載資源的路徑問(wèn)題

    解決vue-cli webpack打包后加載資源的路徑問(wèn)題

    今天小編就為大家分享一篇解決vue-cli webpack打包后加載資源的路徑問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Vue3 之 Vue 事件處理指南

    Vue3 之 Vue 事件處理指南

    Vue事件處理是每個(gè)Vue項(xiàng)目的必要方面。 它用于捕獲用戶輸入,共享數(shù)據(jù)以及許多其他創(chuàng)造性方式。在本文中,會(huì)介紹基礎(chǔ)知識(shí),并提供一些用于處理事件的代碼示例。需要的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • vue如何從接口請(qǐng)求數(shù)據(jù)

    vue如何從接口請(qǐng)求數(shù)據(jù)

    本篇文章主要介紹了vue如何從接口請(qǐng)求數(shù)據(jù) ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Vue CLI中模式與環(huán)境變量的深入詳解

    Vue CLI中模式與環(huán)境變量的深入詳解

    模式是 Vue CLI 項(xiàng)目中一個(gè)重要的概念,下面這篇文章主要給大家介紹了關(guān)于Vue CLI中模式與環(huán)境變量的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • vue-print-nb只打印一頁(yè)解決方法示例

    vue-print-nb只打印一頁(yè)解決方法示例

    這篇文章主要為大家介紹了vue-print-nb只打印一頁(yè)解決方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-11-11
  • vue 組件中使用 transition 和 transition-group實(shí)現(xiàn)過(guò)渡動(dòng)畫(huà)

    vue 組件中使用 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

最新評(píng)論