vue3 axios封装

在vue3中axios的封装和vue2中是有一些区别的,vue3中可以使用 js 文件和 ts 文件,vue2中只能使用js文件,想要在vue3中封装axios需要先安装axios:

npm install axios

 在安装完成之后,需要在根目录添加三个验证文件进行环境配置: 

     一种是开发环境,就是本地开发时的环境,

     一种是测试环境,就是测试人员使用的服务环境

     一种是生产环境,就是要发布到线上的环境。

注意:日常开发是用开发环境的,如果发布到线上时,需要切换环境为线上。如果人为去切换也是可以的,但是会容易忘记,可以通过配置不同的运行命令来自动切换环境。

步骤一:手动创建 文件 .env.development 和.env.production和.env.test几个文件:

.env.development如下:(开发环境)

NODE_ENV = 'development'
VUE_APP_MODE = 'development'
VUE_APP_API_URL = 'http://47.94.4.201/'

.env.production如下:(正式线上环境,或者叫生产环境)

NODE_ENV = 'production'
VUE_APP_MODE = 'production'
VUE_APP_API_URL = 'https://www.zzgoodqc.cn/'

.env.test(测试环境)

NODE_ENV = 'test'
VUE_APP_MODE = 'test'
VUE_APP_API_URL = 'http://49.94.4.21/'
outputDir = test

但是想要使用测试环境就需要在package.json文件中添加 test 命令:

//找到package.json  
"scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint",
    "test": "vue-cli-service build --mode test",
    "publish": "vue-cli-service build && vue-cli-service build --mode test"
  },

在创建完成后需要在 src 文件下创建一个名叫 api 的文件夹,文件夹中创建两个ts文件api.ts;http.tsapp.ts中引入 axios 并添加拦截器,封装调用方法:

import axios from "axios";

axios.defaults.timeout = 1000;

axios.defaults.baseURL = process.env.VUE_APP_API_URL;
// 添加响应拦截器
axios.interceptors.response.use(
  function (response) {
    if (process.env.VUE_APP_MODE === "development") {
      //开发环境下的执行操作
      console.log("开发");
    } else if (process.env.VUE_APP_MODE === "test") {
      //测试环境下的执行操作
      console.log("测试");
    } else {
      //生产环境下的执行操作
      console.log("正式");
    }
    //可以写if判断,提前拦截错误信息
    return response;
  },
  function (err) {
    return Promise.reject(err);
  }
);

export function apiGet(url: any, params?: any) {
  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        params: params,
        headers: { token: sessionStorage.getItem("token") },
      })
      .then((res) => {
        resolve(res.data);
      })
      .catch((err) => {
        reject(err);
      });
  });
}
export function apiPost(url: any, params: any) {
  return new Promise((resolve, reject) => {
    axios({
      method: "post",
      url: url,
      data: params,
      headers: { token: sessionStorage.getItem("token") },
    })
      .then((res) => {
        resolve(res.data);
      })
      .catch((err) => {
        reject(err.data);
      });
  });
}

一次封装完成之后,进行二次封装,在 http.ts 文件中引入 api.ts 文件中所导出的调用方法就可以在下方进行使用:

import { apiGet, apiPost } from "@/api/api";

// 获取验证码
export function getcode() {
  return new Promise((resolve, reject) => {
    apiGet("/index.php/index/index/getcode")
      .then((res: any) => {
        resolve(res);
      })
      .catch((err: any) => {
        reject(err);
      });
  });
}

// 登录接口
export function postlogin(str: any) {
  return new Promise((resolve, reject) => {
    apiPost("/index.php/index/index/login", str)
      .then((res: any) => {
        resolve(res);
      })
      .catch((err: any) => {
        reject(err);
      });
  });
}

最后就可以在需要使用axios的组件页面中引入并使用封装好的axios方法了:

import { postlogin,getcode } from "@/api/http";


// 登录
function loginfun() {
  let data = {
    username: username.value,
    pwd: pwd.value,
  };
  postlogin(data).then((res: any) => {
    let token = res.data.token;
    sessionStorage.setItem("token", token);
    if (res.code == 0) {
      open1();
      router.push({ path: "/home" });
    } else {
      open2(res);
    }
  });
}

//获取验证码
function getcodefun(){

  getcode().then((res) => {

     console.log(res);

  }).catch((res) =>{

     console.log(res);

  })

}

### Vue 3Axios 封装的最佳实践 为了提高代码的复用性和可维护性,在 Vue 3 项目中可以按照以下方式封装 Axios: #### 创建 Axios 实例并配置基础选项 通过创建一个独立的 Axios 实例,可以在全局范围内统一管理请求的基础配置和拦截器逻辑。 ```javascript // utils/request.js import axios from &#39;axios&#39;; const service = axios.create({ baseURL: process.env.VUE_APP_BASE_API, // API 基础路径可以从环境变量获取 timeout: 5000, // 请求超时时间 (毫秒) }); export default service; ``` 此部分定义了 Axios 的基本属性,例如 `baseURL` 和 `timeout`[^2]。 --- #### 添加请求拦截器 在请求发送之前可以通过拦截器对请求进行预处理,比如添加认证令牌或修改请求头。 ```javascript service.interceptors.request.use( config => { // 如果存在 token,则将其加入到请求头部 const token = localStorage.getItem(&#39;token&#39;); if (token) { config.headers[&#39;Authorization&#39;] = `Bearer ${token}`; } return config; }, error => { console.error(error); // 打印错误日志 Promise.reject(error); } ); ``` 这段代码展示了如何利用请求拦截器来动态注入 Token 到 HTTP 头部。 --- #### 添加响应拦截器 对于服务器返回的数据,也可以通过响应拦截器来进行集中化处理,例如解析状态码或者捕获异常情况。 ```javascript service.interceptors.response.use( response => { const res = response.data; // 自定义校验:如果接口返回的状态码不是 200 或其他预期值,则抛出错误 if (res.code !== 200) { Message.error(res.message || &#39;Error&#39;); // 使用 Element Plus 提供的消息提示组件显示错误信息 return Promise.reject(new Error(res.message || &#39;Request failed&#39;)); } return res; }, error => { let message = &#39;&#39;; if (error && error.response) { switch (error.response.status) { case 401: message = &#39;Unauthorized&#39;; break; case 403: message = &#39;Forbidden&#39;; break; case 404: message = &#39;Not Found&#39;; break; default: message = error.message || &#39;Unknown Error&#39;; } } else { message = error.message || &#39;Network Error&#39;; } Notification.error(message); // 显示通知消息 return Promise.reject(error); } ); ``` 这里实现了基于不同 HTTP 状态码的行为控制以及友好的用户体验反馈机制。 --- #### 定义通用请求方法 将封装后的 Axios 放入单独的服务文件夹下,并导出多个具体功能的方法以便调用方更方便地使用这些服务。 ```typescript // api/index.ts import service from &#39;@/utils/request&#39;; interface ILoginParams { username: string; password: string; } export function login(data: ILoginParams) { return service.post(&#39;/auth/login&#39;, data).then(response => response.result); } ``` 上述例子说明了如何针对特定业务场景设计简洁明了的 API 函数接口[^3]。 --- #### 解决跨域问题 当遇到前后端分离架构下的 CORS 跨源资源共享限制时,可通过 Node.js 配置代理解决开发阶段中的跨域难题。 ```javascript module.exports = { devServer: { proxy: { &#39;/api&#39;: { target: &#39;http://your-backend-server.com&#39;, changeOrigin: true, pathRewrite: { &#39;^/api&#39;: &#39;&#39; }, }, }, }, }; ``` 这是关于如何调整 vue.config.js 文件以支持本地调试期间自动转发请求至远程主机上的解决方案[^4]。 --- #### 结合 Hook 进一步增强功能性 借助 React Hooks 思想模式,还可以构建自定义 Hook 来简化复杂逻辑操作流程。下面是一个简单的取消重复请求的例子: ```typescript function useAxiosWithCancel<T>(config: any): [Promise<T>, () => void] { const controller = new AbortController(); const cancelTokenSource = axios.CancelToken.source(); const request = async (): Promise<T> => { try { const result = await service({...config, cancelToken: cancelTokenSource.token}); return result as T; } catch (err) { throw err; } finally { controller.abort(); // 清理资源 } }; const cancelRequest = () => { cancelTokenSource.cancel(&#39;Operation canceled by the user.&#39;); }; return [request(), cancelRequest]; } ``` 它允许开发者轻松实现中断未完成网络活动的功能特性[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值