axios模块化封装实例化及vue本地解决跨域方案

 更新时间:2023年05月31日 09:22:49   作者:灰太狼的情与殇  
这篇文章主要为大家介绍了axios模块化封装实例化及vue本地解决跨域示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

正文

开发环境 vue+axios+typescript+eslint+prettier

电脑系统 windows10专业版

在使用vue开发的过程中,我们在数据交互的过程中,一般会选择使用axios,很多小伙伴都在使用,下面我来分享一下axios封装和vue开发解决跨域。

安装axios

npm i axios -S

后端接口如下

主机一:http://192.168.0.103:8020
   接口: /api/login
主机二: http://192.168.0.103:3000
   接口: /chen

根目录结构

在根目录下,新建文件,目录结构如下:

----src
----.env.development
----.env.production
----.env.test

env.development代码

NODE_ENV = 'development'
//指定当前环境模式
VUE_APP_CURRENTMODE = 'development'
VUE_APP_BASE_URL = "http://192.168.0.103:8020"
VUE_APP_BASE_PL="http://192.168.0.103:3000"
VUE_APP_BASE_PLAPI="/chen"
VUE_APP_BASE_API="/api"

在src录下,新建network文件夹,目录结构如下:

----src
-----network
------Instances(实例集合)
-------index.ts(引入实例)
-------Instance1.ts(实例1)
-------Instance2.ts(实例2)
------api.js(接口封装)

Instances下Instance1.ts代码

import axios from "axios";
export const Instance1 = (config: Object) => {
  const instance = axios.create({
    baseURL: process.env.VUE_APP_BASE_PLAPI,
    timeout: 900000,
  });
  instance.interceptors.request.use(
    (config) => {
      if (config.method === "get") {
        config.url = config.url + "?" + config.data;
      }
      if (sessionStorage.getItem("Authorization")) {
        config.headers.Authorization =
          "auth " + sessionStorage.getItem("Authorization");
      }
      // //console.log("请求拦截成功啦");
      // //console.log(config);
      return config;
    },
    (err) => {
      console.log("请求失败啦");
      console.log(err);
    }
  );
  //
  instance.interceptors.response.use(
    (res) => {
      return res.data;
    },
    (err) => {
      console.log("响应失败");
      console.log(err);
      // return err;
    }
  );
  return instance(config);
};

Instances下Instance2.ts代码

import axios from "axios";
import qs from "qs";
export const Instance2 = (config: Object) => {
  const instance = axios.create({
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 900000,
  });
  instance.interceptors.request.use(
    (config) => {
      if (config.method === "get") {
        config.url = config.url + "?" + qs.stringify(config.data);
      }
      if (sessionStorage.getItem("Authorization")) {
        config.headers.Authorization =
          "auth " + sessionStorage.getItem("Authorization");
      }
      // //console.log("请求拦截成功啦");
      // //console.log(config);
      return config;
    },
    (err) => {
      console.log("请求失败啦");
      console.log(err);
    }
  );
  //
  instance.interceptors.response.use(
    (res) => {
      return res.data;
    },
    (err) => {
      console.log("响应失败");
      console.log(err);
      // return err;
    }
  );
  return instance(config);
};

Instances下index.ts代码

import { Instance1 } from "@/network/Instances/Instance1";
import { Instance2 } from "@/network/Instances/Instance2";
export { Instance1, Instance2 };

networt中api.ts代码

import { Instance1, Instance2 } from "@/network/Instances";
export const Chen = (value: any) => {
  return Instance1({
    url: "/chen",
    method: "post",
    // data: value, //传参方式一:缺点(如果这个接口在很多地方进行了调用,修改参数了,我们需要修改很多的地方)
    data: { password, account, code } //传参方式二:推荐传参方法,可以更好的维护
  });
};
export const Login2 = (value: any) => {
  return Instance2({
    url: "/login",
    method: "post",
    data: value,
  });
};

在根目录下新建vue.config.js

(和package.json同级),代码如下

module.exports = {
  // 打包的时候去掉.map文件
  productionSourceMap: false,
  devServer: {
    proxy: {
      "/api": {
        target: process.env.VUE_APP_BASE_URL,
        changeOrigin: true,
        ws: true,
        pathRewrite: {
          "^/api": process.env.VUE_APP_BASE_URL + process.env.VUE_APP_BASE_API
        },
      },
      "/chen": {
        target: process.env.VUE_APP_BASE_PL,
        changeOrigin: true,
        ws: true,
        pathRewrite: {
          "^/chen": process.env.VUE_APP_BASE_PL
        },
      },
    }
  },
  chainWebpack: (config) => {
    // 开启eslint自动修复,关键代码
    config.module
      .rule("eslint")
      .use("eslint-loader")
      .loader("eslint-loader")
      .tap((options) => {
        options.fix = true;
        return options;
      });
  },
};

请求结果如下:

本地的分享到了这里就结束啦,希望对你有所帮助,让我们一起努力走向巅峰,更多关于axios模块化封装(实例化)和vue本地解决跨域的资料请关注脚本之家其它相关文章!

相关文章

  • 解决$store.getters调用不执行的问题

    解决$store.getters调用不执行的问题

    今天小编就为大家分享一篇解决$store.getters调用不执行的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • vuex状态管理浅谈之mapState用法

    vuex状态管理浅谈之mapState用法

    当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余,为了解决这个问题我们可以使用mapState辅助函数帮助我们生成计算属性,这篇文章主要给大家介绍了关于vuex状态管理之mapState用法的相关资料,需要的朋友可以参考下
    2023-12-12
  • Vue实现自动检测以及版本的更新

    Vue实现自动检测以及版本的更新

    当用户在当前站点停留时间比较长,中途站点进行升级更新之后,用户如果不刷新页面就任然停留在旧的页面里,如何让用户收到一个提示,引导用户进行更新操作呢?下面给大家介绍如何站点更新如何在生产环境提示用户更新,进行页面刷新操作,核心原理其实很简单
    2023-03-03
  • Vue中的vue-resource示例详解

    Vue中的vue-resource示例详解

    Vue与后台Api进行交互通常是利用vue-resource来实现的,本质上vue-resource是通过http来完成AJAX请求相应的。这篇文章主要介绍了Vue中的vue-resource示例详解,需要的朋友可以参考下
    2018-11-11
  • uniapp中easycom用法实例详解

    uniapp中easycom用法实例详解

    easycom是Uniapp框架中非常方便的组件自动注册机制,可以大大简化组件的使用和管理,这篇文章主要介绍了uniapp中easycom用法详解,需要的朋友可以参考下
    2023-03-03
  • vue开发树形结构组件(组件递归)

    vue开发树形结构组件(组件递归)

    这篇文章主要为大家详细介绍了vue开发树形结构组件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 深入探究Vue2响应式原理的实现及存在的缺陷

    深入探究Vue2响应式原理的实现及存在的缺陷

    Vue的响应式数据机制是其核心特性之一,它能够自动追踪数据的变化,并实时更新相关的视图,然而,Vue2中的响应式数据机制并非完美无缺,本文将探讨Vue2响应式原理及其存在的缺陷
    2023-08-08
  • 详解vue中axios的封装

    详解vue中axios的封装

    这篇文章大家分享了vue中axios的封装的相关知识点以及实例代码,有兴趣的朋友参考学习下。
    2018-07-07
  • vue 组件数据加载解析顺序的详细代码

    vue 组件数据加载解析顺序的详细代码

    Vue.js的解析顺序可以概括为:模板编译、组件创建、数据渲染、事件处理和生命周期钩子函数执行,接下来通过本文给大家介绍vue 组件数据加载解析顺序的完整代码,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • Vue项目启动白屏问题的几种解决办法

    Vue项目启动白屏问题的几种解决办法

    这篇文章主要给大家介绍了关于Vue项目启动白屏问题的几种解决办法,Vue项目打包后出现白屏的可能原因有很多,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-12-12

最新评论