TS + Axios簡(jiǎn)單使用

  • 在ts項(xiàng)目中給axios的config加屬性,例如 loading
  • 定義接口返回的數(shù)據(jù)類型

1 簡(jiǎn)單封裝axios

/**
 * ~/src/utils/api.request.ts
 */
import axios from 'axios';
import { Toast } from 'vant';
const baseURL = import.meta.env.VITE_REQUEST_BASE_URL;

/**
 * 創(chuàng)建axios實(shí)例
 */
const axiosInstance = axios.create({
  baseURL,
  timeout: 15000,
});

/**
 * 請(qǐng)求攔截
 */
axiosInstance.interceptors.request.use(
  function (config) {
    // 打開 loading
    if (config.loading) {
      Toast.loading({
        message: 'loading...',
        forbidClick: true,
        duration: 0,
      });
    }

    return config;
  },
  function (error) {
    // 對(duì)請(qǐng)求錯(cuò)誤做些什么
    return Promise.reject(error);
  },
);

/**
 * 響應(yīng)攔截
 */
axiosInstance.interceptors.response.use(
  function (response) {
    // 關(guān)閉 loading
    if (response.config.loading) {
      Toast.clear();
    }

    // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么
    return response.data;
  },
  function (error) {
    // 關(guān)閉 loading
    if (error.config.loading) {
      Toast.clear();
    }

    // console.log('error', error);
    // console.log('error.request', error.request);
    // console.log('error.config', error.config);
    // console.log('error.response', error.response);
    // console.log('error.message', error.message);

    // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么
    switch (error.response?.status) {
      case 400:
        error.message = '請(qǐng)求錯(cuò)誤(400)';
        break;
      case 401:
        error.message = '未授權(quán)(401)';
        break;
      case 403:
        error.message = '拒絕訪問(wèn)(403)';
        break;
      case 404:
        error.message = '請(qǐng)求出錯(cuò)(404)';
        break;
      case 408:
        error.message = '請(qǐng)求超時(shí)(408)';
        break;
      case 500:
        error.message = '服務(wù)器錯(cuò)誤(500)';
        break;
      case 501:
        error.message = '服務(wù)未實(shí)現(xiàn)(501)';
        break;
      case 502:
        error.message = '網(wǎng)絡(luò)錯(cuò)誤(502)';
        break;
      case 503:
        error.message = '服務(wù)不可用(503)';
        break;
      case 504:
        error.message = '網(wǎng)絡(luò)超時(shí)(504)';
        break;
      case 505:
        error.message = 'HTTP版本不受支持(505)';
        break;
      default:
        error.message = `連接出錯(cuò)(${error.response?.status})!`;
    }
    Toast.fail(error.message);

    return Promise.reject(error);
  },
);

export default axiosInstance;
export const request = axiosInstance.request;

2 axios config添加自定義屬性

在根目錄添加一個(gè)新的***.d.ts文件

/**
 * ~/src/***.d.ts
 */
import { AxiosRequestConfig } from 'axios';

declare module 'axios' {
  export interface AxiosRequestConfig {
    loading?: boolean;
    // [自定義屬性聲明]
  }
}

3 axios 聲明接口響應(yīng)數(shù)據(jù)類型

使用泛型聲明響應(yīng)數(shù)據(jù)的類型

import { request } from '@/utils/api.request';
import { TypeRequestApiResult } from '#types/***'

request<unknown, TypeRequestApiResult>

4 完整使用

/**
 * ~/src/apis/***.ts
 */
import { request } from '@/utils/api.request';
import {
  TypeRequestApiParams,
  TypeRequestApiResult,
} from '#types/***';

// 請(qǐng)求
export const RequestApi = (data: TypeRequestApiParams) => {
  return request<unknown, TypeRequestApiResult>({
    method: 'post',
    url: '***',
    data,
    loading: true,
  });
};

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • TS 入門和Vue實(shí)踐 一、TS 快速上手 從 JavaScript 程序員的角度總結(jié)思考,快速上手理解 Type...
    以虛名稱之閱讀 21,525評(píng)論 0 15
  • TypeScript 是 JavaScript 的一個(gè)超集,主要提供了類型系統(tǒng)和對(duì) ES6 的支持,它由 Micr...
    Gukson666閱讀 8,916評(píng)論 3 29
  • 1. TypeScript工程化開發(fā) 前端工程化就是通過(guò)流程規(guī)范化、標(biāo)準(zhǔn)化提升團(tuán)隊(duì)協(xié)作效率 通過(guò)組件化、模塊化提升...
    張Piers閱讀 1,281評(píng)論 0 0
  • 心里最崇拜的那個(gè)人,不必變成那個(gè)人,而是用那個(gè)人的精神和方法,去變成你自己----本文來(lái)自拉勾大前端 Ajax A...
    安掌門dear閱讀 3,597評(píng)論 0 9
  • vite腳手架創(chuàng)建項(xiàng)目 1、全局安裝vite腳手架 2、使用腳手架創(chuàng)建項(xiàng)目 3、進(jìn)入項(xiàng)目文件夾 4、安裝依賴 5、...
    微芒不朽閱讀 5,692評(píng)論 0 19

友情鏈接更多精彩內(nèi)容