vue封装axios请求

在vue项目中我们发送请求一般是使用axios 我们可以封装axios来避免冗余代码

首先引入axios

shell 复制代码
npm install axios

创建环境配置文件

js 复制代码
NODE_ENV = 'development'
VITE_APP_TITLE = 'dev'
VITE_APP_BASE_API = '/test'
VITE_SERVE = "http://127.0.0.1"

上面是创建dev配置文件 也可以定义多个 自己配置即可

创建一个request的文件夹
index.ts(配置axios)

ts 复制代码
import axios from "axios";
import router from "@/router";

import {ElMessage} from "element-plus";

declare module 'axios' {
    interface AxiosInstance {
        (config: AxiosRequestConfig): Promise<any>
    }
}
// 创建一个 axios 实例
const service = axios.create({
    baseURL: import.meta.env.VITE_SERVE,
    timeout: 60000, // 请求超时时间毫秒
});

//请求拦截器
service.interceptors.request.use((config) => {
    // config.headers("token", localStorage.getItem("token"));
    config.headers.token = localStorage.getItem("token");
    //返回配置对象
    return config;
});

//响应拦截器 我的项目code 0代表成功 401 -1 1代表登录状态失效  需要跳转到登录页面
service.interceptors.response.use((response) => {
    const {code, msg} = response.data;
    if (code !== 0) {
        ElMessage({
            message: msg,
            type: "error",
        });
    }
    if (code == 401 || code == -1 || code == 1) {
        setTimeout(async () => {
            // 登录失效
            localStorage.clear();
            await router.push("/login");
        }, 2000);
    }
    //简化数据
    return response.data;
}, (error) => {
    console.log("异常", error);
},)


export default service;

method.ts(封装请求)

ts 复制代码
import service from "@/request/index";
// 地址
let prefix = import.meta.env.VITE_APP_BASE_API;

/**
 * get请求
 * @param url 请求地址
 * @param data 请求参数
 * @param api 特殊的请求代理
 * @returns
 */
export function get(url: string, data: any = {}, api?: string) {
  let baseUrl = prefix;
  let params = [];
  for (const item in data) {
    params.push(`${item}=${data[item]}`);
  }
  if (api) {
    baseUrl = api;
  }
  url =
    baseUrl + url + (Object.keys(data).length ? "?" : "") + params.join("&");
  return service({
    url,
    method: "GET",
    data,
  });
}
/**
 * post请求
 * @param url 请求地址
 * @param data 请求参数
 * @returns
 */
export function post(url: string, data = {}) {
  url = prefix + url;
  return service({
    url,
    method: "POST",
    data,
  });
}

创建api文件夹(汇总请求)
api.ts

ts 复制代码
import {get, post} from "@/request/method";

/** 获取验证码 **/
export const API_Login_GetSmsCode = (phone: any) => get(`/sms/send?phone=${phone}`);
/** 验证码登录 **/
export const API_Login = (params: any) => post("/user/login", params);

上面演示了两种请求方式 get和post的使用方法

在vue页面中直接导入

ts 复制代码
import {API_Login, API_Login_GetSmsCode} from "@/api/api";

// 登录表单数据
const loginForm = reactive({
  // 验证码登录字段
  smsCode: "",
  userPhone: ""
})

// 发送验证码
async function smsSend() {
  if (loginForm.userPhone.length <= 0) {
    ElMessage.error("请输入手机号")
    return
  }
  const {code} = await API_Login_GetSmsCode(loginForm.userPhone)
  if (code === 0) {
    ElMessage.success("发送成功")
    startCountdown();
  }
}

// 登录请求
async function loginReq() {
  const {code, data} = await API_Login(loginData)
  if (code === 0) {
      ElMessage.success("登录成功")
      localStorage.setItem("token", data.token)
      localStorage.setItem("userName", data.userName)
      await $router.push('/home')
  }
}
相关推荐
狂师12 分钟前
比 Playwright 更给力,推荐一个AI Agent的浏览器自动化开源项目!
前端·开源·测试
IT_陈寒21 分钟前
React hooks 闭包陷阱把我的状态吃掉了,原来问题出在这里
前端·人工智能·后端
壹方秘境23 分钟前
使用ApiCatcher在 iOS 上像修改 hosts 一样自定义域名解析
前端·后端·客户端
柳杉1 小时前
可视化大屏设计器脚手架:从设计到交付的一站式方案
前端·three.js·数据可视化
铁皮饭盒1 小时前
3行代码搞定页面截图,Bun.WebView真的简单
javascript
kyriewen14 小时前
我手写了一个 EventEmitter,面试官追问了 6 个问题——第 4 个我没答上来
前端·javascript·面试
IT_陈寒14 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
山河木马15 小时前
矩阵专题2-怎么创建视图矩阵(uViewMatrix)
javascript·webgl·计算机图形学
小林攻城狮15 小时前
使用 Transport 节流解决 Vercel AI SDK 流式渲染卡死问题
前端·react.js
前端缘梦15 小时前
告别 TS 运行时类型漏洞!Zod 完整入门实战教程(前端 / 全栈必备)
前端·react.js·全栈