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

十分鐘封裝一個(gè)好用的axios步驟示例

 更新時(shí)間:2022年06月16日 15:43:10   作者:szqlovexyt  
這篇文章主要為大家介紹了十分鐘封裝一個(gè)好用的axios步驟示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

項(xiàng)目啟動(dòng)會(huì)議上,大家各種出排期,各種出方案,大多數(shù)人的焦點(diǎn)都放在后端技術(shù)方案上,感情大家好像都覺(jué)得前期準(zhǔn)備工作前端沒(méi)啥好做的,不都有現(xiàn)成的腳手架嗎?別人不都幫你做好了嗎?????我丟。。。。你說(shuō)的好像不是沒(méi)有道理,但是你真的用過(guò)官方的腳手架嗎,除了幫我生成項(xiàng)目目錄和打包編譯之類的配置,還是有些框架層面的東西要我自己做的好吧。我不管我不管,你們都有啟動(dòng)準(zhǔn)備排期,我他喵的也要??!??

想想需要做什么

我爭(zhēng)取到了一周的準(zhǔn)備(劃水摸魚)時(shí)間,主要還是后端的大佬們牛批會(huì)爭(zhēng)取啊,我只能和他們持平了,啊哈哈哈。先用vue-cli生成一個(gè)project吧,想想做些什么,想到以前的做項(xiàng)目通用請(qǐng)求能力封裝這一塊前期做的不太好,導(dǎo)致后面寫起來(lái)一堆冗余代碼,著實(shí)惡心到我了。那我必須前期把這個(gè)整整????

通用能力

列一下我想要這個(gè)通用請(qǐng)求能達(dá)到什么樣的效果

1.正常請(qǐng)求該有的(跨域攜帶cookie,token,超時(shí)設(shè)置)

2.請(qǐng)求響應(yīng)攔截器

  • 請(qǐng)求成功,業(yè)務(wù)狀態(tài)碼200,解析result給我,我不想一層一層的去判斷拿數(shù)據(jù)
  • http請(qǐng)求200, 業(yè)務(wù)狀態(tài)碼非200,說(shuō)明邏輯判斷這是不成功的,那就全局message提示服務(wù)端的報(bào)錯(cuò)
  • http請(qǐng)求非200, 說(shuō)明http請(qǐng)求都有問(wèn)題,也全局message提示報(bào)錯(cuò)
  • http請(qǐng)求或者業(yè)務(wù)狀態(tài)碼401都做注銷操作

3.全局的loading配置, 默認(rèn)開(kāi)啟,可配置關(guān)閉(由于后端的問(wèn)題,經(jīng)常會(huì)讓前端加防抖節(jié)流或者loading不讓用戶在界面上瘋狂亂點(diǎn),行吧行吧,你們的問(wèn)題前端幫你們解決,你的規(guī)矩就是規(guī)矩是吧??)

4.統(tǒng)一文件下載處理 (不要再去各寫各的下載了,你寫一個(gè),他寫一個(gè),一個(gè)項(xiàng)目就是這樣整的跟屎一樣)

一步一步添加功能實(shí)現(xiàn)

正常請(qǐng)求該有的

import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
export const createAxiosByinterceptors = (
  config?: AxiosRequestConfig
): AxiosInstance => {
  const instance = axios.create({
    timeout: 1000,    //超時(shí)配置
    withCredentials: true,  //跨域攜帶cookie
    ...config,   // 自定義配置覆蓋基本配置
  });
  return instance;
};

請(qǐng)求響應(yīng)攔截器

import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
import { Message } from "element-ui";
import { jumpLogin } from "@/utils";
export const createAxiosByinterceptors = (
  config?: AxiosRequestConfig
): AxiosInstance => {
  const instance = axios.create({
    timeout: 1000,    //超時(shí)配置
    withCredentials: true,  //跨域攜帶cookie
    ...config,   // 自定義配置覆蓋基本配置
  });
  // 添加請(qǐng)求攔截器
  instance.interceptors.request.use(
    function (config: any) {
      // 在發(fā)送請(qǐng)求之前做些什么
      console.log("config:", config);
      // config.headers.Authorization = vm.$Cookies.get("vue_admin_token");
      return config;
    },
    function (error) {
      // 對(duì)請(qǐng)求錯(cuò)誤做些什么
      return Promise.reject(error);
    }
  );
  // 添加響應(yīng)攔截器
  instance.interceptors.response.use(
    function (response) {
      // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么
      console.log("response:", response);
      const { code, data, message } = response.data;
      if (code === 200) return data;
      else if (code === 401) {
         jumpLogin();
      } else {
         Message.error(message);
         return Promise.reject(response.data);
      }
    },
    function (error) {
      // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么
      console.log("error-response:", error.response);
      console.log("error-config:", error.config);
      console.log("error-request:", error.request);
      if (error.response) {
        if (error.response.status === 401) {
          jumpLogin();
        }
      }
      Message.error(error?.response?.data?.message || "服務(wù)端異常");
      return Promise.reject(error);
    }
  );
  return instance;
};

全局的loading配置

import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
import { Message } from "element-ui";
import { jumpLogin } from "@/utils";
import { Loading } from "element-ui";
import { ElLoadingComponent } from "element-ui/types/loading";
// import vm from "@/main";
let loadingInstance: ElLoadingComponent | null = null;
let requestNum = 0;
const addLoading = () => {
  // 增加loading 如果pending請(qǐng)求數(shù)量等于1,彈出loading, 防止重復(fù)彈出
  requestNum++;
  if (requestNum == 1) {
    loadingInstance = Loading.service({
      text: "正在努力加載中....",
      background: "rgba(0, 0, 0, 0)",
    });
  }
};
const cancelLoading = () => {
  // 取消loading 如果pending請(qǐng)求數(shù)量等于0,關(guān)閉loading
  requestNum--;
  if (requestNum === 0) loadingInstance?.close();
};
export const createAxiosByinterceptors = (
  config?: AxiosRequestConfig
): AxiosInstance => {
  const instance = axios.create({
    timeout: 1000,    //超時(shí)配置
    withCredentials: true,  //跨域攜帶cookie
    ...config,   // 自定義配置覆蓋基本配置
  });
  // 添加請(qǐng)求攔截器
  instance.interceptors.request.use(
    function (config: any) {
      // 在發(fā)送請(qǐng)求之前做些什么
      const { loading = true } = config;
      console.log("config:", config);
      // config.headers.Authorization = vm.$Cookies.get("vue_admin_token");
      if (loading) addLoading();
      return config;
    },
    function (error) {
      // 對(duì)請(qǐng)求錯(cuò)誤做些什么
      return Promise.reject(error);
    }
  );
  // 添加響應(yīng)攔截器
  instance.interceptors.response.use(
    function (response) {
      // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么
      console.log("response:", response);
      const { loading = true } = response.config;
      if (loading) cancelLoading();
      const { code, data, message } = response.data;
      if (code === 200) return data;
      else if (code === 401) {
        jumpLogin();
      } else {
         Message.error(message);
         return Promise.reject(response.data);
      }
    },
    function (error) {
      // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么
      console.log("error-response:", error.response);
      console.log("error-config:", error.config);
      console.log("error-request:", error.request);
      const { loading = true } = error.config;
      if (loading) cancelLoading();
      if (error.response) {
        if (error.response.status === 401) {
          jumpLogin();
        }
      }
      Message.error(error?.response?.data?.message || "服務(wù)端異常");
      return Promise.reject(error);
    }
  );
  return instance;
};

統(tǒng)一文件下載處理

import axios, { AxiosInstance, AxiosRequestConfig } from "axios";
import { Message } from "element-ui";
import { jumpLogin, downloadFile } from "@/utils";
import { Loading } from "element-ui";
import { ElLoadingComponent } from "element-ui/types/loading";
// import vm from "@/main";
let loadingInstance: ElLoadingComponent | null = null;
let requestNum = 0;
const addLoading = () => {
  // 增加loading 如果pending請(qǐng)求數(shù)量等于1,彈出loading, 防止重復(fù)彈出
  requestNum++;
  if (requestNum == 1) {
    loadingInstance = Loading.service({
      text: "正在努力加載中....",
      background: "rgba(0, 0, 0, 0)",
    });
  }
};
const cancelLoading = () => {
  // 取消loading 如果pending請(qǐng)求數(shù)量等于0,關(guān)閉loading
  requestNum--;
  if (requestNum === 0) loadingInstance?.close();
};
export const createAxiosByinterceptors = (
  config?: AxiosRequestConfig
): AxiosInstance => {
  const instance = axios.create({
    timeout: 1000,    //超時(shí)配置
    withCredentials: true,  //跨域攜帶cookie
    ...config,   // 自定義配置覆蓋基本配置
  });
  // 添加請(qǐng)求攔截器
  instance.interceptors.request.use(
    function (config: any) {
      // 在發(fā)送請(qǐng)求之前做些什么
      const { loading = true } = config;
      console.log("config:", config);
      // config.headers.Authorization = vm.$Cookies.get("vue_admin_token");
      if (loading) addLoading();
      return config;
    },
    function (error) {
      // 對(duì)請(qǐng)求錯(cuò)誤做些什么
      return Promise.reject(error);
    }
  );
  // 添加響應(yīng)攔截器
  instance.interceptors.response.use(
    function (response) {
      // 對(duì)響應(yīng)數(shù)據(jù)做點(diǎn)什么
      console.log("response:", response);
      const { loading = true } = response.config;
      if (loading) cancelLoading();
      const { code, data, message } = response.data;
      // config設(shè)置responseType為blob 處理文件下載
      if (response.data instanceof Blob) {
        return downloadFile(response);
      } else {
        if (code === 200) return data;
        else if (code === 401) {
          jumpLogin();
        } else {
          Message.error(message);
          return Promise.reject(response.data);
        }
      }
    },
    function (error) {
      // 對(duì)響應(yīng)錯(cuò)誤做點(diǎn)什么
      console.log("error-response:", error.response);
      console.log("error-config:", error.config);
      console.log("error-request:", error.request);
      const { loading = true } = error.config;
      if (loading) cancelLoading();
      if (error.response) {
        if (error.response.status === 401) {
          jumpLogin();
        }
      }
      Message.error(error?.response?.data?.message || "服務(wù)端異常");
      return Promise.reject(error);
    }
  );
  return instance;
};
src/utils/index.ts
import { Message } from "element-ui";
import { AxiosResponse } from "axios";
import vm from "@/main";
/**
 *   跳轉(zhuǎn)登錄
 */
export const jumpLogin = () => {
  vm.$Cookies.remove("vue_admin_token");
  vm.$router.push(`/login?redirect=${encodeURIComponent(vm.$route.fullPath)}`);
};
/**
 * 下載文件
 * @param response
 * @returns
 */
export const downloadFile = (response: AxiosResponse) => {
  console.log("response.data.type:", response.data.type);
  return new Promise((resolve, reject) => {
    const fileReader = new FileReader();
    fileReader.onload = function () {
      try {
        console.log("result:", this.result);
        const jsonData = JSON.parse((this as any).result); // 成功 說(shuō)明是普通對(duì)象數(shù)據(jù)
        if (jsonData?.code !== 200) {
          Message.error(jsonData?.message ?? "請(qǐng)求失敗");
          reject(jsonData);
        }
      } catch (err) {
        // 解析成對(duì)象失敗,說(shuō)明是正常的文件流
        const blob = new Blob([response.data]);
        // 本地保存文件
        const url = window.URL.createObjectURL(blob);
        const link = document.createElement("a");
        link.href = url;
        const filename = response?.headers?.["content-disposition"]
          ?.split("filename*=")?.[1]
          ?.substr(7);
        link.setAttribute("download", decodeURI(filename));
        document.body.appendChild(link);
        link.click();
        resolve(response.data);
      }
    };
    fileReader.readAsText(response.data);
  });
};

使用

import { createAxiosByinterceptors } from "@/api/request";
const request = createAxiosByinterceptors({
  baseURL: localhost:7007,
});
//lodaing配置
export const appList = (params: any): Promise<any> =>
  request.get("/app", { params, loading: true }); // 不需要默認(rèn)的全局loading效果可配置loading為false關(guān)閉 loading默認(rèn)為true
// 文件下載
export const exportGoods = (data: any) =>
  request.post("/export", data, {
    responseType: "blob",
  });

完結(jié)撒花??????

以上就是十分鐘省時(shí)又省力封裝一個(gè)好用的axios步驟示例的詳細(xì)內(nèi)容,更多關(guān)于axios封裝步驟的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 5個(gè)可以加速開(kāi)發(fā)的VueUse函數(shù)庫(kù)(小結(jié))

    5個(gè)可以加速開(kāi)發(fā)的VueUse函數(shù)庫(kù)(小結(jié))

    VueUse為Vue開(kāi)發(fā)人員提供了大量適用于Vue2和Vue3的基本Composition API 實(shí)用程序函數(shù)。具有一定的參考價(jià)值,感興趣的可以了解一下
    2021-11-11
  • Vue使用axios進(jìn)行數(shù)據(jù)異步交互的方法

    Vue使用axios進(jìn)行數(shù)據(jù)異步交互的方法

    大家都知道在Vue里面有兩種出名的插件能夠支持發(fā)起異步數(shù)據(jù)傳輸和接口交互,分別是axios和vue-resource,同時(shí)vue更新到2.0之后,宣告不再對(duì)vue-resource更新,而是推薦的axios,今天就講一下怎么引入axios,需要的朋友可以參考下
    2024-01-01
  • Vue使用wangEditor實(shí)現(xiàn)自定義粘貼功能

    Vue使用wangEditor實(shí)現(xiàn)自定義粘貼功能

    這篇文章主要為大家詳細(xì)介紹了Vue如何使用wangEditor實(shí)現(xiàn)自定義粘貼功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12
  • 詳解Vue項(xiàng)目的打包方式(生成dist文件)

    詳解Vue項(xiàng)目的打包方式(生成dist文件)

    本文主要介紹了詳解Vue項(xiàng)目的打包方式(生成dist文件),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • VueX如何實(shí)現(xiàn)數(shù)據(jù)共享

    VueX如何實(shí)現(xiàn)數(shù)據(jù)共享

    這篇文章主要介紹了VueX如何實(shí)現(xiàn)數(shù)據(jù)共享問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 使用Vue3實(shí)現(xiàn)列表虛擬滾動(dòng)的詳細(xì)步驟

    使用Vue3實(shí)現(xiàn)列表虛擬滾動(dòng)的詳細(xì)步驟

    在前端開(kāi)發(fā)中,列表的虛擬滾動(dòng)是一種常見(jiàn)的優(yōu)化手段,可以大大提升頁(yè)面性能,在Vue3中,我們可以通過(guò)一些技巧來(lái)實(shí)現(xiàn)列表的虛擬滾動(dòng),本文將介紹如何使用Vue3實(shí)現(xiàn)列表的虛擬滾動(dòng),讓你的頁(yè)面加載更快、更流暢,需要的朋友可以參考下
    2024-09-09
  • Ant Design Upload 文件上傳功能的實(shí)現(xiàn)

    Ant Design Upload 文件上傳功能的實(shí)現(xiàn)

    這篇文章主要介紹了Ant Design Upload 文件上傳功能的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 詳解Vue中的Props與Data細(xì)微差別

    詳解Vue中的Props與Data細(xì)微差別

    這篇文章主要介紹了詳解Vue中的Props與Data細(xì)微差別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • 解決vue表單為空也能提交的問(wèn)題

    解決vue表單為空也能提交的問(wèn)題

    這篇文章主要介紹了解決vue表單為空也能提交的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • vue項(xiàng)目打包解決靜態(tài)資源無(wú)法加載和路由加載無(wú)效(404)問(wèn)題

    vue項(xiàng)目打包解決靜態(tài)資源無(wú)法加載和路由加載無(wú)效(404)問(wèn)題

    這篇文章主要介紹了vue項(xiàng)目打包,解決靜態(tài)資源無(wú)法加載和路由加載無(wú)效(404)問(wèn)題,靜態(tài)資源無(wú)法使用,那就說(shuō)明項(xiàng)目打包后,圖片和其他靜態(tài)資源文件相對(duì)路徑不對(duì),本文給大家介紹的非常詳細(xì),需要的朋友跟隨小編一起看看吧
    2023-10-10

最新評(píng)論

伽师县| 塔河县| 仁布县| 安顺市| 汪清县| 萨嘎县| 焉耆| 霍城县| 崇义县| 辉南县| 罗甸县| 井陉县| 荥经县| 望谟县| 清涧县| 禄劝| 茌平县| 六盘水市| 台中市| 岚皋县| 南雄市| 同德县| 德格县| 淮北市| 泉州市| 大埔区| 固始县| 井冈山市| 赤城县| 拜城县| 桐庐县| 山西省| 晴隆县| 庆元县| 西吉县| 绥芬河市| 固安县| 临朐县| 五华县| 惠安县| 合川市|