首页 > 其他分享 >vue项目多axios实例动态创建

vue项目多axios实例动态创建

时间:2023-12-20 14:22:34浏览次数:40  
标签:axios return url 动态创建 vue const data response

// 通用请求拦截器
import axios from "axios";
import Qs from "qs";
import store from "@/store";
import router from "@/router";
import { Loading, Message } from "element-ui"; // 引用element-ui的加载和消息提示组件

let loading = null;

// 添加公共请求拦截
const interceptorsReq = (config) => {
  loading = Loading.service({ text: "拼命加载中" });
  const token = store.getters.token;
  if (token) {
    config.headers.Authorization = "Bearer " + token; // 请求头部添加token
  }
};

// 添加公共响应拦截
const interceptorsRes = (response) => {
  if (loading) {
    loading.close();
  }
  if (response.data.code && response.data.code === 50000) {
    alert("您的账户已在其他设备登录,如不是本人操作,请及时更改密码");
    //router.push('/login')
    store.commit("DEL_TOKEN");
    router.replace({
      path: "/login",
      query: {
        redirect: router.currentRoute.fullPath,
      },
    });
    sessionStorage.clear();
    location.reload();

    return false;
  }
  if (response.data.code === 500001) {
    Message.error("请求接口过于频繁,请三秒后再试");
    return false;
  }

  const code = response.status;
  if ((code >= 200 && code < 300) || code === 304) {
    return Promise.resolve(response.data);
  } else {
    return Promise.reject(response);
  }
};

const createInstance = (baseURL, interceptorsFn) => {
  const instance = axios.create({
    baseURL,
    timeout: 30000,
  });
  instance.interceptors.request.use(
    (config) => {
      // 添加公共处理函数
      interceptorsReq(config);
    //   interceptorsFn.interceptorsReq(config);
      return config;
    },
    (error) => {
      return Promise.reject(error);
    }
  );

  instance.interceptors.response.use(
    (response) => {
      // 添加公共处理函数
      interceptorsRes(response);
    //   interceptorsFn.interceptorsRes(response);
      return response.data;
    },
    (error) => {
      if (loading) {
        loading.close();
      }
      console.log(error);
      return Promise.reject(error);
    }
  );

  return instance;
};

// 对不同环境的VUE_APP环境进行动态创建不同的axios实例导出
// 对于复杂的实例可以使用interceptorsFn参数进行扩展
let apiMap = {};
let instanceMap = {};
for (const apiKey in process.env) {
  const url = process.env[apiKey];
  const instanceName = apiKey.replace("VUE_APP_", "").toLocaleLowerCase();
  // 子元素为http链接
  if (url.startsWith("http")) {
    // 动态设置aixos实例
    apiMap[instanceName] = url;
    instanceMap[instanceName] = createInstance(url);
    createInstance(url).post = (url, data)=>{
        post(url, data)
    };
    createInstance(url).get = (url, params)=>{
        get(url, params)
    };
  }
}

console.log(apiMap);
console.log(instanceMap);

function post(url, data) {
  return $axios({
    method: "post",
    url,
    data: Qs.stringify(data),
    headers: {
      "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
    },
  });
}
function get(url, params) {
  return $axios({
    method: "get",
    url,
    params,
  });
}

// createInstance

// // get,post请求方法
export default {
    ...instanceMap
};

标签:axios,return,url,动态创建,vue,const,data,response
From: https://www.cnblogs.com/brujie/p/17916426.html

相关文章

  • uniapp vue3版本的scroll-view的scroll-into-view方法不生效解决
    问题代码如图bug原因建了vue2版本和vue3版本的uniapp分别测试,vue3版本的scroll-view存在scroll-into-view不生效的问题,目前未修复(23.12.20)解决方法,换了个思路,如图思路:获取当前选中元素的left值,并动态绑定给scroll-left实现定位效果......
  • 【前端VUE】VUE通信组件学习(附源代码)
    propsprops可以实现父子组件通信,不管是在vue2或者vue3,props数据还是只读的!!!不能直接修改其值;在vue3中,我们可以通过defineProps获取父组件传递的数据,且在组建内部不需要引入defineProps方法可以直接使用,如下面例子Parent.vue//父组件<template><h3>props组件案例</h3......
  • Jenkins自动化构建Vue项目的实践
    在现代的Web开发中,Vue.js已经成为一种非常流行的JavaScript框架。为了更高效地管理和部署Vue.js项目,使用自动化构建工具是至关重要的。Jenkins作为一款强大的持续集成和持续部署(CI/CD)工具,为我们提供了一种便捷的方式来自动化构建Vue.js项目。本文将介绍如何在Jenkins中配置和使用自......
  • vue3 实现用户登录和权限验证思路梳理
    2023-12-20星期三一、用登录和退出问题1登录 思路一: 1.1login登录页面,将token存储本地中。 1.2前置路由守卫获取token并验证, 1.3前置路由从缓存中获取用户的访问权限,并生成动态路由。 1.4aixos请求拦截器,从存储中获取存储的token,在所有请求前,设置请求头 思......
  • vue中@param 常用注释模板
    /***获取事件在列表中的位置*@paramcontext*@paramcallback*@private*/_evIndex(event,context,callback){letindex=-1;for(leti=0;i<=event.length;i++){if(event[i].context===contex&&event[i].callback===callback){......
  • vue基础
    一、什么是Vue1.简介Vue(读音/vjuː/,类似于view)是一套用于构建用户界面的渐进式的js框架,发布于2014年2月。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库(如:vue-router,vue-resource,vuex)或既有项目整......
  • springboot019食品安全管理系统(vue)
    1 绪 论1.1课题研究背景及意义1.2研究现状以及发展趋势1.2.1研究现状1.2.2发展趋势1.3研究目标2相关技术介绍2.1SpringBoot介绍Spring的全家桶,我想在Java开发领域大家都知道了吧,那么关于spring的框架,自从我们大学都开始学的,Java语言在基础知识当中不会涉及到框架,但一旦学......
  • springboot020汽车改装方案网站(vue)
    1绪论1.1课题背景:当今电子信息发展十分迅猛,软件行业发展的节奏也非常的快。在我们日常的生活中有很多非常智能的软件,除此之外新兴的智能软件也如雨后春笋般的出现,人们的生活方式也一点一点的被潜移默化的改变着,当今社会的这种生活方式也是一种更人性化的“懒人”模式,比如人们在......
  • springboot016高校学生党员发展管理系统(vue,毕业设计,附数据库和源码)
    1绪论1.1研究背景1.2研究现状1.3研究意义2系统开发工具介绍2.1Springboot2.2VUE框架2.3Mysql数据库3可行性分析3.1技术的可行性3.2经济的可行性3.3操作可行性 4系统需求分析4.1系统功能需求管理系统的主要功能结构图呈现如下:图4.1高校发展学生党员管理系统功能结构......
  • 88道Vue高频题整理(附答案背诵版)
    1、请简述Vue插件和组件的区别?Vue的插件(Plugin)和组件(Component)是Vue.js中非常重要的两个概念,它们在功能上有着明显的差异。Vue组件(Component):Vue组件是Vue.js最强大的功能之一。组件可以扩展HTML元素,封装可重用的代码。在较大的Vue.js应用中,我们会把整个应用拆分成一些小的、......