Vue3.0+TS 簡(jiǎn)單封裝axios

1. 安裝axios 和 js-cookie

npm i axios js-cookie @types/js-cookie -S

2. 在src目錄下創(chuàng)建plugins文件夾棍矛,在里面創(chuàng)建cookie.ts 封裝一下js-cookie

import Cookies from 'js-cookie';

const TokenKey = 'token'
const RefreshTokenKey = 'refresh-token'

export function getToken() {
  return Cookies.get(TokenKey)
}
export function getTokenKey() {
  return TokenKey
}
export function getRefreshTokenKey() {
  return RefreshTokenKey
}

export function setToken(token: any) {
  return Cookies.set(TokenKey, token)
}

export function getRefreshToken() {
  return Cookies.get(RefreshTokenKey)
}

export function setRefreshToken(refreshToken: any) {
  return Cookies.set(RefreshTokenKey, refreshToken)
}

export function removeToken() {
  Cookies.remove(TokenKey)
  Cookies.remove(RefreshTokenKey)
}

3. 在src目錄下創(chuàng)建http文件夾,在里面創(chuàng)建攔截器配置文件interceptors.ts

因?yàn)榫秃?jiǎn)單的寫了一個(gè)例子,所以所有報(bào)錯(cuò)信息都是使用console.error();來返回 后面可以自己使用組件庫的彈框修改一下返回樣式即可

// 首先引入axios和上一步封裝的cookie方法
import axios, { AxiosInstance } from "axios";
import {
  setToken,
  setRefreshToken,
  getToken,
  getTokenKey,
  getRefreshToken,
  getRefreshTokenKey,
  removeToken,
} from "../plugins/cookie";

export class Interceptors {
  instance: AxiosInstance;
  constructor() {
    this.instance = axios.create({
      baseURL: "/api",
      timeout: 10000,
    });
  }
  // 初始化攔截器
  init() {
    // 請(qǐng)求接口攔截器
    this.instance.interceptors.request.use(
      (config) => {
        // 判斷一下是否有cookie 如果有的話則把cookie放入請(qǐng)求頭中
        if (getToken()) {
          config.headers[getTokenKey()] = getToken();
          config.headers[getRefreshTokenKey()] = getRefreshToken();
        }
        return config;
      },
      (err) => {
        console.error(err);
      }
    );

    // 響應(yīng)攔截器
    this.instance.interceptors.response.use(
      (response) => {
        const res = response.data;
        if (!response.status.toString().startsWith("2") || res.code === -1) {
          // 如果狀態(tài)碼不是2開頭或者接口code返回-1 則是返回錯(cuò)誤信息
          console.error("系統(tǒng)錯(cuò)誤,請(qǐng)檢查API是否正常狞悲!");
          return;
        }
        if (res.code !== 0) {
          if (res.code === -3) {
            console.error("登錄過期");
            removeToken();
          } else {
            if (res.msg) {
              console.error(res.msg);
            }
          }
          return Promise.resolve(res);
        } else {
          // 返回成功則把token存儲(chǔ)一下
          const headers = response.headers;
          const token = headers.token;
          const refresh_token = headers["refresh-token"];
          if (token && refresh_token) {
            setToken(token);
            setRefreshToken(refresh_token);
          }
          return res;
        }
      },
      (error) => {
        if (error.message === "Request failed with status code 500") {
          console.error("系統(tǒng)錯(cuò)誤庇绽,請(qǐng)檢查API是否正常!");
          return;
        }
        let code = -110;
        if (error && error.response && error.response.status) {
          code = error.response.status;
          // 登陸過期
          if (code === 401 || code === -3) {
            removeToken();
          }
        } else {
          console.error(error.message);
        }
        const err = { errCode: -110, errMsg: error.message || "Error" };
        return Promise.resolve(err);
      }
    );
  }
  // 返回一下
  getInterceptors() {
    return this.instance;
  }
}

4. 攔截器封裝好了就簡(jiǎn)單封裝一下axios 在http文件夾下創(chuàng)建index.ts

import { AxiosPromise, AxiosResponse } from "axios";
import { Interceptors } from "./interceptors";

// 請(qǐng)求配置
export class HttpServer {
  axios: any;
  // 獲取axios實(shí)例
  constructor() {
    this.axios = new Interceptors().getInterceptors();
  }
  // 簡(jiǎn)單封裝一下方法
  request(config: any): AxiosPromise {
    return new Promise((resolve, reject) => {
      this.axios(config).then((res: AxiosResponse) => {
        resolve(res);
      }).catch((err: any) => {
        reject(err)
      });
    });
  }
}

const http = new HttpServer()

export default http

5. 把封裝好的axios掛在到vue上 在之前的plugins文件夾下面新建axios.ts文件

個(gè)人習(xí)慣把插件都放在plugins文件夾下面

import { App } from "vue";
import http from "../http";
import { AxiosInstance } from "axios";

declare module "@vue/runtime-core" {
  interface ComponentCustomProperties {
    $axios?: AxiosInstance;
  }
}

export const axiosPlugin = {
  install(app: App): void {
    app.config.globalProperties.$axios = http;
  },
};

export default axiosPlugin

6.最后在main.ts里面引入

import { createApp } from "vue";
import App from "./App.vue";
import router from "./router";
import store from "./store";
import { axiosPlugin } from './plugins/axios';

const app = createApp(App)
app.use(store).use(router).use(axiosPlugin).mount("#app")

使用方法

  • 在ts文件使用
import http from "../http/index";
function userLogin(data: any) {
    return http.request({
        url: "/user/login",
        method: "post",
        data
    })
}
  • 在vue文件使用
<script lang="ts">
import { getCurrentInstance } from "vue"
...
// 使用getCurrentInstance方法獲取當(dāng)前vdom實(shí)例
const axios = getCurrentInstance()?.appContext.config.globalProperties.$axios
axios.request({
  url: '/user/login',
  method: 'post',
  data: login
})
...
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末懊亡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子乎串,更是在濱河造成了極大的恐慌店枣,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叹誉,死亡現(xiàn)場(chǎng)離奇詭異鸯两,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)长豁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門钧唐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匠襟,你說我怎么就攤上這事钝侠。” “怎么了酸舍?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵帅韧,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我啃勉,道長(zhǎng)忽舟,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮叮阅,結(jié)果婚禮上刁品,老公的妹妹穿的比我還像新娘。我一直安慰自己帘饶,他們只是感情好哑诊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著及刻,像睡著了一般镀裤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上缴饭,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天暑劝,我揣著相機(jī)與錄音,去河邊找鬼颗搂。 笑死担猛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丢氢。 我是一名探鬼主播傅联,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼疚察!你這毒婦竟也來了蒸走?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤貌嫡,失蹤者是張志新(化名)和其女友劉穎比驻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岛抄,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡别惦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年拥诡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亚享。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纪蜒,死狀恐怖蹭秋,靈堂內(nèi)的尸體忽然破棺而出扰付,到底是詐尸還是另有隱情,我是刑警寧澤感凤,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布悯周,位于F島的核電站粒督,受9級(jí)特大地震影響陪竿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一族跛、第九天 我趴在偏房一處隱蔽的房頂上張望闰挡。 院中可真熱鬧,春花似錦礁哄、人聲如沸长酗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夺脾。三九已至,卻和暖如春茉继,著一層夾襖步出監(jiān)牢的瞬間咧叭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工烁竭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留菲茬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓派撕,卻偏偏與公主長(zhǎng)得像婉弹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子终吼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容