vue3 学习笔记04 -- axios的使用及封装

vue3 学习笔记04 -- axios的使用及封装

  • 安装 Axios 和 TypeScript 类型定义

    npm install axios
    npm install -D @types/axios

创建一个 Axios 实例并封装成一个可复用的模块,这样可以在整个应用中轻松地进行 API 请求管理。

  • 在 src 目录下创建一个 services 文件夹,并在其中创建 api.ts 文件:
ts 复制代码
  // src/services/api.ts

import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';

// 创建一个 axios 实例
const api: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_APP_BASE_API,
  timeout: 30000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
    // 其他默认请求头可以在这里配置
  }
});

// 请求拦截器
api.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    // 在请求发送之前做些什么,例如加入 token 等操作
    return config;
  },
  (error) => {
    // 处理请求错误
    return Promise.reject(error);
  }
);

// 响应拦截器
api.interceptors.response.use(
  (response: AxiosResponse) => {
    // 在响应数据返回之前做些什么,例如对响应数据进行处理
    return response.data;
  },
  (error) => {
    // 处理响应错误
    return Promise.reject(error);
  }
);

export default api;
ts 复制代码
export default defineConfig({
  plugins: [vue()],

  server:{
    host: '0.0.0.0', // 允许IP访问
    proxy: {
        [env.VITE_APP_BASE_API]: {
          changeOrigin: true,
          target: env.VITE_APP_TARGET_URL,
          secure: false,
          rewrite: (path) => path.replace(new RegExp(`^${env.VITE_APP_BASE_API}`), '')
        },
      }
  }
})
  • 使用axios封装

    • 在src/api文件下新建login/login.ts文件

      ts 复制代码
          import api from '@/services/api';
          import { AxiosPromise } from "axios";
          import { LoginData, LoginResult } from "./types";
          export function login(data:LoginData):AxiosPromise<LoginResult> {
              return api({
                  url: '/mock/user/login',
                  method: 'post',
                  data
              })
          }
    • src/login/types.ts

      ts 复制代码
          export interface LoginData {
              /**
              * 用户名
              */
              username: string;
              /**
              * 密码
              */
              password: string;
          }
          export interface userInfoVo {
              id: number
              name: string
              phone: number
          }
          /**
          * 登录响应
          */
          export interface LoginResult {
              /**
              * token
              */
              token?: string;
              /**
              * 过期时间(单位:毫秒)
              */
              expireAt?: number;
              /**
              * 刷新token
              */
              refreshToken?: string;
              /**
              * 用户信息
              */
              userInfo?: userInfoVo[];
          }
  • vue文件中使用

js 复制代码
<template>
 form表单.....
<el-button class="login-button" type="primary" @click="handleLogin" :loading="loading"
        >登录</el-button
      >
</template> 
<script setup lang="ts">
import { login } from '@/api/login/login'
import { useRouter } from 'vue-router'
let loading = ref(false)
const router = useRouter()
const handleLogin = ()=>{
    let data = {
        username:'xxx',
        password:'xxx'
    }
    loading.value = true
    login(data).then((res)=>{
        loading.value = false
        // 一些存储token及其他信息的处理的处理
        ....要干的事
        router.push('/')
    })
}
</script>  
相关推荐
志尊宝21 分钟前
Vue3 零基础每日笔记(038):亲手封装 useDebounceFn 与 useThrottleFn——高频事件的流量阀
前端·javascript·vue·html·vue3
CAYA-1 小时前
模电笔记1.1 半导体基础与 PN 结
经验分享·笔记·学习方法
泡泡鱼(敲代码中)2 小时前
MySQL 学习笔记:DCL、函数与约束 —— 安全、效率、完整性的三板斧
开发语言·笔记·sql·学习·mysql·gitee
商业白皮书4 小时前
AI 创业公司同步布局欧美与亚太市场,推荐选择哪些支持多区域部署的云平台?
笔记
kaixin_啊啊5 小时前
中国研究生数学建模竞赛(华为杯)学习笔记——AI绘图方法
人工智能·笔记·学习·数学建模
aaaameliaaa5 小时前
结构体 结构体
c语言·笔记·算法
有Li6 小时前
【AI答疑】MR数据预处理步骤
人工智能·笔记·算法·语言模型·医学生
江湖人称菠萝包7 小时前
【Qt】《Qt 5.9 C++开发指南》笔记-Chapter3-Qt类库概述
笔记·qt·qt5
江屿风8 小时前
【Linux系统】【Linux进程终止等待详解与程序替换机制初体验】流食般投喂
linux·运维·笔记·系统架构·centos·unix
愛芳芳8 小时前
基于 Electron + Vue3 的仿 PC 微信客户端项目实战
前端·javascript·css·elementui·typescript·electron·vue