vue3 學習筆記04 – axios的使用及封裝
- 安裝 Axios 和 TypeScript 類型定義
npm install axios
npm install -D @types/axios
創建一個 Axios 實例并封裝成一個可復用的模塊,這樣可以在整個應用中輕松地進行 API 請求管理。
- 在 src 目錄下創建一個 services 文件夾,并在其中創建 api.ts 文件:
// src/services/api.tsimport 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;
- 項目根目錄新建.env.dev – 開發環境變量
NODE_ENV = 'development'
VITE_APP_BASE_API = '/api'
VITE_APP_TARGET_URL = "https://api.example.com"
- 項目根目錄新建.env.pro – 生產環境變量
NODE_ENV = 'production'
VITE_APP_BASE_API = '/api'
VITE_APP_TARGET_URL = "https://api.example.com"
- vite.config.ts中配置proxy
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文件
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
export interface LoginData {/*** 用戶名*/username: string;/*** 密碼*/password: string;}export interface userInfoVo {id: numbername: stringphone: number}/*** 登錄響應*/export interface LoginResult {/*** token*/token?: string;/*** 過期時間(單位:毫秒)*/expireAt?: number;/*** 刷新token*/refreshToken?: string;/*** 用戶信息*/userInfo?: userInfoVo[];}
- 在src/api文件下新建login/login.ts文件
-
vue文件中使用
<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 = truelogin(data).then((res)=>{loading.value = false// 一些存儲token及其他信息的處理的處理....要干的事router.push('/')})
}
</script>