精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Vue3使用hook封裝常見(jiàn)的幾種異步請(qǐng)求函數(shù)場(chǎng)景,讓開(kāi)發(fā)更絲滑

開(kāi)發(fā) 前端
初始化一個(gè)請(qǐng)求函數(shù),然后根據(jù)初始參數(shù),立即發(fā)送請(qǐng)求,返回請(qǐng)求結(jié)果,并且返回請(qǐng)求回調(diào)函數(shù),方便我們根據(jù)新的參數(shù)再次調(diào)用。

?? 立即請(qǐng)求函數(shù)

我們期望的場(chǎng)景是,

  • 初始化一個(gè)請(qǐng)求函數(shù),然后根據(jù)初始參數(shù),立即發(fā)送請(qǐng)求
  • 返回請(qǐng)求結(jié)果,并且返回請(qǐng)求回調(diào)函數(shù),方便我們根據(jù)新的參數(shù)再次調(diào)用
  • 要求返回值包含加載中狀態(tài),錯(cuò)誤信息以及正常的數(shù)據(jù)類型。

我的實(shí)現(xiàn)過(guò)程如下:

定義具體的數(shù)據(jù)返回值簽名

interface Fetch<T> {
  loading: boolean,
  value?: T, // 具體的返回類型是泛型
  error?: string
}

完整的簽名如下

export declare function useFetch <T, Params>(
  fn: (args: Params) => Promise<T>,
  initParams: Params  
): [Fetch<T>, (params: Params) => Promise<unknown>]

函數(shù)實(shí)現(xiàn)如下:

export const useFetch = <T, Params>(
  fn: (args: Params) => Promise<T>,
  initParams: Params  
): [Fetch<T>, (params: Params) => Promise<T>] => {
  
  // 定義基礎(chǔ)的數(shù)據(jù)格式
  const data = reactive<Fetch<T>>({
    loading: true,
    value: undefined,
    error: undefined
  }) as Fetch<T> // 這里會(huì)報(bào)錯(cuò):T類型無(wú)法賦值給UnwrapRef<T>類型
  // 我不懂為啥,UnwrapRef是vue的深層響應(yīng)式類型的聲明
  // 這里導(dǎo)致我無(wú)法默認(rèn)的類型賦值,不符合直覺(jué),可能是我ts太菜了
  // 懂的大佬評(píng)論區(qū)帶帶我吧
  
  // 定義請(qǐng)求回調(diào)
  const callback = (params: Params): Promise<T> => new Promise((resolve, reject) => {
    data.loading = true
    fn(params)
      .then(result => {
        data.value = result as any
        resolve(result)
      })
      .catch(error => {
        data.error = error
        reject(error)
      })
      .finally(() => data.loading = false)
  })

  // 立即執(zhí)行
  watchSyncEffect(() => {
    callback(initParams)
  })

  return [data, callback]
}

我們驗(yàn)證下

<script setup lang="ts">
import { reactive } from 'vue';
import { useFetch } from './hooks/index';

const fn = () => new Promise((resolve) => {
  setTimeout(()=> resolve({data: [], msg: '', code: 200}), 1000)
})

const [data, fetch] = useFetch<unknown, object>(fn, {})

</script>

<template>
  <h4>公眾號(hào):萌萌噠草頭將軍</h4>

  <!-- 加載中時(shí)用css禁用按鈕 -->
  <button
    :style="{'pointer-events': data.loading ? 'none' : 'auto'}"
    @click="fetch({})"
  >{{ data.loading ? 'laoding...' : 'fetch' }}</button>
  
  <h1 v-if="data.loading">loading...</h1>
  <h1 v-else>{{data.value}}</h1>
</template>

fetch.giffetch.gif

頁(yè)面刷新后立即發(fā)出請(qǐng)求了!

?? 手動(dòng)請(qǐng)求函數(shù)

我們期望的場(chǎng)景是,

  • 初始化一個(gè)請(qǐng)求函數(shù)
  • 返回請(qǐng)求回調(diào)函數(shù),方便我們調(diào)用
  • 要求返回值包含加載中狀態(tài),錯(cuò)誤信息以及正常的數(shù)據(jù)類型

這個(gè)的實(shí)現(xiàn)和上面類似,我們不需要初始參數(shù)和類型,也不用立即執(zhí)行,

完整的簽名如下

export declare function useFetch <T>(
  fn: (args: unknown) => Promise<T>
): [Fetch<T>, (params: unknown) => Promise<T>]

實(shí)現(xiàn)如下:

export const useFetchFn = <T>(
  fn: (args: unknown) => Promise<T>
): [Fetch<T>, (params: unknown) => Promise<T>] => {
  
  const data = reactive<Fetch<T>>({
    loading: false, // 默認(rèn)為false
    value: undefined,
    error: undefined
  }) as Fetch<T>

  const callback = (params: unknown): Promise<T> => new Promise((resolve, reject) => {
    data.loading = true
    fn(params)
      .then(result => {
        data.value = result as any
        resolve(result)
      })
      .catch(error => {
        data.error = error
        reject(error)
      })
      .finally(() => data.loading = false)
  })

  return [data, callback]
}

驗(yàn)證如下:

<script setup lang="ts">
import { reactive } from 'vue';
import { useFetchFn } from './hooks/index';

const fn = () => new Promise((resolve) => {
  setTimeout(()=> resolve({data: [], msg: '', code: 200}), 1000)
})

const [data, fetch] = useFetchFn<unknown>(fn)

</script>

<template>
  <h4>公眾號(hào):萌萌噠草頭將軍</h4>

  <!-- 加載中時(shí)用css禁用按鈕 -->
  <button
    :style="{'pointer-events': data.loading ? 'none' : 'auto'}"
    @click="fetch({})"
  >{{ data.loading ? 'laoding...' : 'fetch' }}</button>
  
  <h1 v-if="data.loading">loading...</h1>
  <h1 v-else>{{data.value}}</h1>
</template>

fetchfn.giffetchfn.gif

頁(yè)面刷新后沒(méi)有發(fā)出請(qǐng)求,點(diǎn)擊按鈕之后才發(fā)出請(qǐng)求!

?? 自動(dòng)請(qǐng)求函數(shù)

我們期望的場(chǎng)景是,

  • 初始化一個(gè)請(qǐng)求函數(shù),然后根據(jù)初始參數(shù),立即發(fā)送請(qǐng)求
  • 當(dāng)參數(shù)發(fā)生變化時(shí),自動(dòng)根據(jù)最新參數(shù)發(fā)送請(qǐng)求
  • 要求返回值包含加載中狀態(tài),錯(cuò)誤信息以及正常的數(shù)據(jù)類型。

這個(gè)的實(shí)現(xiàn)和立即請(qǐng)求函數(shù)類似,只需要監(jiān)聽(tīng)參數(shù)的變化,

完整的簽名如下

export declare function useFetch <T, Params>(
  fn: (args: Params) => Promise<T>,
  initParams: Params  
): Fetch<T>

實(shí)現(xiàn)如下:

export const useAutoFetch = <T, Params>(
  fn: (args: Params) => Promise<T>,
  initParams: Params  
): Fetch<T> => {
  
  const data = reactive<Fetch<T>>({
    loading: true,
    value: undefined,
    error: undefined
  }) as Fetch<T>

  const callback = (params: Params): Promise<T> => new Promise((resolve, reject) => {
    data.loading = true
    fn(params)
      .then(result => {
        data.value = result as any
        resolve(result)
      })
      .catch(error => {
        data.error = error
        reject(error)
      })
      .finally(() => data.loading = false)
  })

  // 如果不需要立即執(zhí)行,可沒(méi)有這步
  const effects = watchSyncEffect(() => {
    callback(initParams)
  })

  // 自動(dòng)監(jiān)聽(tīng)參數(shù)變化
  const effects = watch([initParams], () => callback(initParams))
  // 卸載頁(yè)面時(shí),關(guān)閉監(jiān)聽(tīng)
  onUnmounted(() => effects())

  return data
}

我們驗(yàn)證下功能

<script setup lang="ts">
import { reactive, watch } from 'vue';
import { useAutoFetch } from './hooks/index';

const fn = () => new Promise((resolve) => {
  setTimeout(()=> resolve({data: [], msg: '', code: 200}), 1000)
})

const params = reactive({
  age: 9
})

const data = useAutoFetch<unknown, object>(fn, params)

watch(params, () => console.log(params))

</script>

<template>
  <h4>公眾號(hào):萌萌噠草頭將軍</h4>
  
  <div>{{ params.age }}</div>
  <!-- 加載中時(shí)用css禁用按鈕 -->
  <button
    :style="{'pointer-events': data.loading ? 'none' : 'auto'}"
    @click="() => params.age++"
  >{{ data.loading ? 'laoding...' : 'change params' }}</button>
  
  <h1 v-if="data.loading">loading...</h1>
  <h1 v-else>{{data.value}}</h1>
</template>

auto.gifauto.gif

每次當(dāng)我們改變參數(shù)時(shí)自動(dòng)發(fā)送請(qǐng)求。

責(zé)任編輯:武曉燕 來(lái)源: 萌萌噠草頭將軍
相關(guān)推薦

2020-07-22 15:15:28

Vue前端代碼

2025-03-10 08:44:17

2025-06-04 08:35:00

立即執(zhí)行函數(shù)IIFEJavaScript

2025-03-03 12:00:00

JavaScriptfor 循環(huán)語(yǔ)言

2024-11-06 10:16:22

2022-09-06 12:20:30

Vue3CVCRUD

2022-07-06 07:42:14

DOMHook標(biāo)簽

2024-05-30 11:44:37

2023-03-15 15:54:36

Java代碼

2022-08-28 10:08:53

前端代碼前端

2011-08-16 15:06:43

IOS開(kāi)發(fā)異步請(qǐng)求

2023-09-27 07:49:23

2022-06-13 08:39:21

Vue3API

2022-07-20 09:06:27

Hook封裝工具庫(kù)

2024-08-13 09:26:07

2022-06-07 08:59:58

hookuseRequestReact 項(xiàng)目

2022-12-19 14:53:07

模型訓(xùn)練

2024-04-02 08:50:08

Go語(yǔ)言react

2021-05-18 07:51:37

Suspense組件Vue3
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

一区二区三区四区影院| 久久精品午夜一区二区福利| 国产精品夜夜夜爽阿娇| 久久wwww| 同产精品九九九| 日韩精品资源| 亚洲国产精品久久人人爱潘金莲| 日韩高清二区| 五月天丁香久久| 日本免费高清不卡| 国产三级精品在线观看| 99精品福利视频| 亚洲欧美制服第一页| 午夜啪啪小视频| 麻豆mv在线看| 亚洲日本成人在线观看| 蜜桃av色综合| a级片在线免费看| 久久一区欧美| 久久久久国色av免费观看性色| 久久精品一卡二卡| xxxx在线视频| 国产精品成人网| 久久亚洲国产精品日日av夜夜| 国产精品成人网站| 日韩国产欧美| 亚洲美女www午夜| 超碰人人cao| 久久亚洲人体| 午夜精品福利一区二区蜜股av | 日韩一级完整毛片| 久久精品一区二| 国产精品69xx| 亚洲色图制服诱惑| 午夜精品一区二区在线观看的| 波多野结衣在线观看一区| 在线成人亚洲| 欧美裸体xxxx极品少妇| 在线看片中文字幕| 日韩在线黄色| 亚洲国产精品悠悠久久琪琪| 无套白嫩进入乌克兰美女| 国产精品一区二区av影院萌芽| 国产欧美日本一区视频| 国产一区二区高清不卡| 亚洲成人第一区| 韩国三级电影一区二区| 国产精品高清在线| www.久久久久久久| 亚洲在线黄色| 日本成人精品在线| 特级毛片www| 国产精品一区亚洲| 欧美一区视频在线| 草久久免费视频| 亚洲一区不卡| 日本精品免费观看| 区一区二在线观看| 快she精品国产999| 国产激情久久久久| 亚洲午夜无码久久久久| 日韩av不卡一区二区| 国产精品久久999| 看黄色一级大片| 日本系列欧美系列| 国产热re99久久6国产精品| 欧美激情一区二区三区免费观看| 欧美日韩日本国产亚洲在线 | 欧美孕妇与黑人孕交| 五月天婷婷丁香| 欧美激情1区2区| 欧美高清自拍一区| 日本a在线观看| 久久激情婷婷| 国产精品入口夜色视频大尺度| 久草视频免费播放| 在线成人欧美| 国产91免费看片| 国产美女www爽爽爽| 免费高清在线一区| 成人福利视频网| 国产熟女精品视频| yourporn久久国产精品| 狼狼综合久久久久综合网| 男男激情在线| 国产精品国产三级国产普通话三级| 国产欧美日韩在线播放| 色噜噜在线播放| 国产亚洲午夜高清国产拍精品| 国产伦精品一区二区三区高清版| 天天射天天干天天| 精久久久久久久久久久| 91传媒视频在线观看| 深夜福利免费在线观看| 国产精品欧美经典| 国产精品久久..4399| 日韩高清不卡| 3d成人h动漫网站入口| 日本人妻一区二区三区| 久久av影视| 欧美久久精品午夜青青大伊人| 一级片黄色录像| 国产精品99免费看| 国产成人激情视频| 国产精品无码久久av| eeuss影院一区二区三区| 欧美日韩在线不卡一区| a毛片在线观看| 一本大道av伊人久久综合| 欧美在线a视频| 亚洲自拍都市欧美小说| 欧美黑人国产人伦爽爽爽| 亚洲免费黄色网址| 国产成人鲁色资源国产91色综| 国产欧美日韩亚洲精品| 午夜av免费在线观看| 久久久精品蜜桃| 男女裸体影院高潮| 国产黄色一区| 亚洲精选一区二区| 日本中文字幕免费| 国产精品亚洲午夜一区二区三区 | 日韩中文字幕在线视频| www.天天色| 国产一区二区三区香蕉| 特级西西444www大精品视频| 波多野结衣中文在线| 欧美人与禽zozo性伦| 中文字幕国产综合| 亚洲国产婷婷| 99在线视频首页| 久操视频在线播放| 欧美三级中文字| av中文字幕免费观看| 99国产精品视频免费观看一公开| 琪琪亚洲精品午夜在线| 亚洲AV无码成人片在线观看| 中文字幕制服丝袜成人av| 国产精品秘入口18禁麻豆免会员| 欧美影视资讯| 日韩毛片中文字幕| 国内免费精品视频| 成人精品亚洲人成在线| 青青草视频在线视频| 国产精品美女久久久久| 久久精品91久久香蕉加勒比| 中文资源在线播放| 久久久www免费人成精品| 男人操女人免费软件| 亚洲电影男人天堂| 人体精品一二三区| 天天躁日日躁狠狠躁喷水| 一区二区三区四区视频精品免费| 欧美 国产 综合| 一区二区中文字幕在线观看| 欧美激情按摩在线| 成人毛片视频免费看| 亚洲第一福利一区| 亚洲中文字幕无码av| 野花国产精品入口| 欧美一区1区三区3区公司| 欧美日韩五码| 国产一区二区三区中文| 亚洲熟妇av乱码在线观看| 综合中文字幕亚洲| 91大神免费观看| 激情亚洲网站| 久久99欧美| 成人精品国产亚洲| 久久影院中文字幕| 黑人乱码一区二区三区av| 好吊成人免视频| av中文字幕免费观看| 久久99久久99小草精品免视看| 精品国产福利| jizz内谢中国亚洲jizz| 亚洲亚裔videos黑人hd| 亚洲手机在线观看| 亚洲一本大道在线| 一本色道久久综合亚洲精品图片| 一区二区影院| 高清免费日韩| 自拍偷拍欧美视频| 中文字幕精品久久| 国产suv一区二区| 精品免费在线视频| 国产又粗又长又硬| 粉嫩aⅴ一区二区三区四区五区| 新呦u视频一区二区| 久久久91麻豆精品国产一区| 77777亚洲午夜久久多人| 丁香婷婷在线观看| 日韩欧美成人激情| 日本久久综合网| 亚洲欧美另类在线| 亚洲欧美色图视频| 久久精品国产一区二区| 加勒比成人在线| sdde在线播放一区二区| 91久久久亚洲精品| xxx欧美xxx| 欧美区在线播放| 国产女主播在线直播| 欧美成人国产一区二区| 蜜臀精品一区二区三区| 亚洲精品写真福利| 无码 人妻 在线 视频| 国产成人综合自拍| 美女网站免费观看视频| 影音先锋久久精品| 亚洲免费精品视频| 中文有码一区| 97se亚洲综合在线| 欧美123区| 98精品在线视频| av毛片在线看| 最新日韩中文字幕| 日本一区视频| 欧美精品一区在线观看| 国产精品人人妻人人爽| 色婷婷av一区二区| 成年人免费看毛片| 亚洲蜜臀av乱码久久精品| 国产人妻一区二区| a美女胸又www黄视频久久| 三级性生活视频| 蜜臀av一区二区| 91视频最新入口| 亚洲国产精品一区| 真人做人试看60分钟免费| 日韩啪啪电影网| 色播五月综合| 精品在线99| 六月婷婷久久| 国产毛片精品| 国产精品久久久久久久小唯西川| heyzo在线播放| 欧美成人精品一区二区| 欧美jizzhd69巨大| 中文字幕精品一区久久久久| 国产在线观看免费| 亚洲女在线观看| 色鬼7777久久| 亚洲国产精品女人久久久| xxxwww在线观看| 日韩一区二区在线观看视频| 99热精品在线播放| 欧美一级理论性理论a| 国产精品一区二区三区在线免费观看 | 国产精品jizz在线观看麻豆| h片在线观看| 97在线精品国自产拍中文| 国产美女福利在线观看| 欧美黑人xxx| 成人免费一区二区三区牛牛| 午夜精品久久久久久久久久久久| 黑人与亚洲人色ⅹvideos| 亚洲精品一区av在线播放| 四虎精品在线| 亚洲韩国欧洲国产日产av| 手机看片一区二区| 日韩激情视频在线播放| 欧美在线一卡| 亚洲一区999| 午夜视频在线观看网站| 久久综合国产精品台湾中文娱乐网| 亚洲 另类 春色 国产| 亚洲国产成人精品久久| 天天摸天天碰天天爽天天弄| 亚洲美女久久久| 91社区在线观看播放| www.亚洲男人天堂| 最新日本在线观看| 久久露脸国产精品| 欧美xx视频| 国产在线a不卡| 97品白浆高清久久久久久| 久久99精品久久久久久三级 | 国产综合精品久久久久成人av| 国产精品一区二区91| 欧美xxxx黑人| 久久综合丝袜日本网| av免费播放网站| 亚洲精品中文在线影院| 成人午夜淫片100集| 欧美裸体bbwbbwbbw| 亚洲黄色a级片| 亚洲精品在线视频| 在线激情免费视频| 欧美激情日韩图片| 欧美成人精品三级网站| 91老司机在线| 日韩av三区| 久久精品国产精品亚洲精品色| 成人三级视频| 污污污污污污www网站免费| 亚洲在线电影| 美女被艹视频网站| 国产清纯白嫩初高生在线观看91 | 中文无码av一区二区三区| 69堂精品视频| 天堂av在线播放| 久久精品国产91精品亚洲| 爱啪啪综合导航| 成人高清视频观看www| 动漫av一区| 亚洲一区二区在线看| 国产一区白浆| 午夜免费一级片| 久久精品一区二区三区不卡 | 日韩av网址大全| 曰韩不卡视频| 午夜在线播放视频欧美| 思思久久精品视频| 国产亚洲精品超碰| 国产精品日日夜夜| 337p亚洲精品色噜噜噜| 国模吧精品人体gogo| 欧美激情精品久久久久久免费印度 | www.在线欧美| 欧美一区二区三区爽爽爽| 91黄视频在线| 午夜18视频在线观看| 欧美国产精品va在线观看| 欧美伊人亚洲伊人色综合动图| 成人h猎奇视频网站| 欧美大胆视频| 日韩国产小视频| 紧缚捆绑精品一区二区| av网在线播放| 色综合夜色一区| 天天操天天舔天天干| 欧美精品videos另类日本| 亚洲黑人在线| 影音欧美亚洲| 全国精品久久少妇| 亚洲自拍偷拍图| 欧美性极品xxxx做受| 亚洲欧洲成人在线| 久久久噜噜噜久久中文字免| 日韩欧洲国产| 久久www视频| 国产精品1区2区3区在线观看| 玖玖爱在线精品视频| 亚洲综合在线免费观看| 91超薄丝袜肉丝一区二区| 丝袜亚洲欧美日韩综合| 国模一区二区| 天天人人精品| 老司机一区二区| 国产真实乱在线更新| 91麻豆精品国产自产在线| 欧美成年黄网站色视频| 91九色国产在线| 中文字幕一区二区三区久久网站| 国产亚洲综合视频| 99天天综合性| www.com国产| 在线a欧美视频| 日韩成人综合网站| av动漫免费观看| 国产精品中文欧美| 精品深夜av无码一区二区老年| 欧美综合视频在线观看| 高清美女视频一区| 国产精品最新在线观看| 1024精品久久久久久久久| 日本女人黄色片| 亚洲成人免费视频| 免费在线视频一级不卡| 国产精品狠色婷| 久久久久久久久久久久久久| 中文字幕在线播放一区二区| 亚洲高清不卡在线| 青青色在线视频| 国产精品第三页| 亚洲不卡av不卡一区二区| 国产精品果冻传媒| 一道本成人在线| 黄色在线免费| 国产日韩欧美二区| 视频一区二区欧美| 精品自拍偷拍视频| 亚洲国产欧美在线成人app| 影音成人av| 国产精品久久国产| 久久婷婷国产综合精品青草 | 在线免费观看不卡av| 日本电影全部在线观看网站视频| 8x海外华人永久免费日韩内陆视频| 成人久久精品| 欧美黑人经典片免费观看| 久久久亚洲国产美女国产盗摄| 999这里只有精品| 中文字幕国产精品久久| 精品国产一区二区三区成人影院| 好吊色视频988gao在线观看| 久久综合999| 不卡视频免费在线观看| 日韩av大片免费看|