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

ts封裝axios并處理返回值的實戰(zhàn)案例

 更新時間:2022年08月02日 08:52:11   作者:Agwenbi  
在vue項目中,和后臺交互獲取數(shù)據(jù)這塊,我們通常使用的是axios庫,下面這篇文章主要給大家介紹了關(guān)于ts封裝axios并處理返回值的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下

本項目的案例是針對vue3

準(zhǔn)備vue3+ts+axios的項目環(huán)境,這里不演示

src下新建所需文件夾及對應(yīng)文件,如下圖

文件信息

  • api 保存所有的接口列表及對應(yīng)的返回數(shù)據(jù)類型
  • http 初始化axios,如果超時,設(shè)置攔截器等操作
  • axios 二次封裝好的axios,供開發(fā)人員使用

設(shè)置api.ts,假設(shè)如下

/**
 * @description: 所有的接口列表
 * @param {*} 無參數(shù)
 * @return {*} 無返回值
 * ```js
 * key表示url路徑縮寫
 * value表示真實請求的路徑
 * ```
 */
const apiList = {
  'getData': '/getData',
  'othersData': '/othersData'
}
/**
 * @description: 所有的接口列表類型
 * @param {*} 無參數(shù)
 * @return {*} 無返回值
 */
export type apiKeyType = keyof typeof apiList;
/**
 * @description: 接口對應(yīng)的數(shù)據(jù)返回值類型
 * @param {*} 無參數(shù)
 * @return {*} 無返回值
 */
export interface apiKeyDataType {
  'getData': {
    code: number;
    data: {
      name: string;
      age: number;
      work: string[]
    }
  },
  'othersData': {
    code: number;
    data: string[]
  }
}

export default apiList;

設(shè)置http.ts

import axios, {Method, AxiosInstance, AxiosRequestConfig, AxiosPromise, AxiosInterceptorManager, AxiosResponse} from 'axios';
import qs from 'qs';
import {apiKeyType, apiKeyDataType} from './api';

type ResultDataType = apiKeyDataType[apiKeyType];
/* 
NewAxiosInstance接口得根據(jù)自己情況來定
  interceptors屬性是必須要有,因為后續(xù)要用到攔截器
  至于<T = any>(config: AxiosRequestConfig): AxiosPromise<T>這一段代碼,因為我后續(xù)二次封裝axios時采用的是此類型,所以我這里
  聲明的是這種數(shù)據(jù)類型
*/
interface NewAxiosInstance extends AxiosInstance {
  /* 
  設(shè)置泛型T,默認(rèn)為any,將請求后的結(jié)果返回變成AxiosPromise<T>
  */
  <T = any>(config: AxiosRequestConfig): AxiosPromise<T>;
  interceptors: {
    request: AxiosInterceptorManager<AxiosRequestConfig>;
    response: AxiosInterceptorManager<AxiosResponse<ResultDataType>>;
  }
}

//基本的初始化設(shè)置
let http: NewAxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_BASE_URL as string, //因為使用的是vite構(gòu)建的項目,所以這里是這么獲取代理名稱的,根據(jù)自己情況修改
  timeout: 3 * 1000// 超時時間
});

// 請求攔截器
const QS_METHOD: Method[] = ['POST', 'post', 'PUT', 'put'];
const GET_METHOD: Method[] = ['GET', 'get', 'DELETE', 'delete'];
http.interceptors.request.use(response => {
  if(response.method && QS_METHOD.includes(response.method)){// 這里只處理post請求,根據(jù)自己情況修改
    response.data = qs.stringify(response.data);
  }else if(response.method && GET_METHOD.includes(response.method)){//設(shè)置GET的請求參數(shù)
  	response.params = qs.parse(response.data);
  	response.data = undefined;
  }
  return response;
}, error => {
  return error;
});

//響應(yīng)攔截器
http.interceptors.response.use(response => {
  return Promise.resolve(response);
}, error => {
  return error;
});

export default http;

設(shè)置axios.ts

import axios from '@/server/http';
import apiList, {apiKeyType, apiKeyDataType} from './api';
import {AxiosRequestConfig} from 'axios';

/* 
限制泛型T必須是接口列表(apiKeyType)中的key
限制obj中的url必須是接口列表中key的某一格
*/
export default <T extends apiKeyType>(obj: AxiosRequestConfig & {url: T}) => {
  /* 
  限制最終的返回數(shù)據(jù)類型
  */
  return new Promise<apiKeyDataType[T]>((resolve, reject) => {
    /* 
    傳遞泛型給http中的攔截器
    */
    axios<apiKeyDataType[T]>({
      url: apiList[obj.url],
      data: obj.data || {},
      method: obj.method || 'GET',
      responseType: obj.responseType || 'json'
    }).then(res => {
      resolve(res.data);
    }).catch(error => {
      reject(error);
    })
  })
}

最終效果

在對應(yīng)文件中引入server下的axios文件輸入選擇url時,將會有全部接口列表提示,如下圖

選到getData時,可以看到返回值是對應(yīng)的數(shù)據(jù)類型,如下

選到othersData時,可以看到返回如下

結(jié)束

到此這篇關(guān)于ts封裝axios并處理返回值的文章就介紹到這了,更多相關(guān)ts封裝axios處理返回值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • ie8下修改input的type屬性報錯的解決方法

    ie8下修改input的type屬性報錯的解決方法

    當(dāng)用戶勾選顯示明文復(fù)選框時,要以明文顯示用戶輸入的密碼,去掉勾選時要變回密文,問題是ie8中是不允許修改input的type屬性
    2014-09-09
  • ES6中的WeakMap和WeakSet特性和用途詳解

    ES6中的WeakMap和WeakSet特性和用途詳解

    在JavaScript的ES6版本中,引入了WeakMap和WeakSet這兩種新的數(shù)據(jù)結(jié)構(gòu),與Map和Set相比,它們有一些特殊的特點和用途,使它們在處理內(nèi)存泄漏問題、管理對象私有數(shù)據(jù)、處理對象的唯一性等場景中有顯著的優(yōu)勢,本文將深入探討WeakMap和WeakSet的特性和用途,一起看看吧
    2023-12-12
  • Uniapp實現(xiàn)地圖獲取定位功能(推薦)

    Uniapp實現(xiàn)地圖獲取定位功能(推薦)

    本文詳細(xì)介紹了如何在Uniapp項目中集成地圖功能,實現(xiàn)定位獲取,并解決微信小程序、APP、H5三端的兼容性問題,涵蓋了環(huán)境準(zhǔn)備、配置地圖基礎(chǔ)功能、獲取用戶定位、多平臺適配要點以及常見問題及解決方案,感興趣的朋友一起看看吧
    2025-03-03
  • 如何在CocosCreator中使用JSZip壓縮

    如何在CocosCreator中使用JSZip壓縮

    這篇文章主要介紹了在CocosCreator中使用JSZip壓縮,對JSZip感興趣的同學(xué),不妨看一下,并且親自試一試
    2021-04-04
  • js代碼實現(xiàn)點擊按鈕出現(xiàn)60秒倒計時

    js代碼實現(xiàn)點擊按鈕出現(xiàn)60秒倒計時

    這篇文章主要為大家詳細(xì)介紹了js代碼實現(xiàn)點擊按鈕出現(xiàn)60秒倒計時,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-12-12
  • js 正則驗證密碼強度(包含數(shù)字+特殊字符+英文字母大小寫)

    js 正則驗證密碼強度(包含數(shù)字+特殊字符+英文字母大小寫)

    密碼驗證是常見的網(wǎng)站注冊方法,本文主要介紹了js 正則驗證密碼強度(包含數(shù)字+特殊字符+英文字母大小寫),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • javascript 密碼強弱度檢測萬能插件

    javascript 密碼強弱度檢測萬能插件

    網(wǎng)上用的比較多的一種用來檢測用戶輸入密碼的強度檢測,其實就是把一些常用的拼音,英文單詞, 純數(shù)字,純字母等。
    2009-02-02
  • 功能強大的Bootstrap使用手冊(一)

    功能強大的Bootstrap使用手冊(一)

    這篇文章主要為大家詳細(xì)介紹了功能強大的Bootstrap使用手冊,分享了Bootstrap使用步驟和常用用法,感興趣的小伙伴們可以參考一下
    2016-08-08
  • 10行原生JS實現(xiàn)文字無縫滾動(超簡單)

    10行原生JS實現(xiàn)文字無縫滾動(超簡單)

    下面小編就為大家分享一篇10行原生JS實現(xiàn)文字無縫滾動的效果,特別簡單,具有很好的參考價值,希望對大家有所幫助
    2018-01-01
  • javascript動態(tài)加載實現(xiàn)方法一

    javascript動態(tài)加載實現(xiàn)方法一

    這兩天,沒什么太多的事情,好吧,我承認(rèn),是我這兩天不想做公司的項目,因為我突發(fā)奇想,其實也不算突發(fā)奇想,算是對以前的想法的實現(xiàn),就是把JS當(dāng)做Java來寫
    2012-08-08

最新評論

象州县| 沭阳县| 九寨沟县| 龙游县| 阳信县| 翼城县| 历史| 会同县| 虎林市| 广南县| 嵊州市| 安陆市| 凤城市| 军事| 休宁县| 蓬莱市| 砚山县| 龙口市| 五指山市| 东乡| 长岛县| 苍溪县| 紫金县| 灵山县| 电白县| 修水县| 东宁县| 房产| 昭苏县| 昌邑市| 巩义市| 金乡县| 青州市| 东光县| 同心县| 荣昌县| 福建省| 会昌县| 隆德县| 桐柏县| 元氏县|