useAxiosFetch 使用文档
useAxiosFetch 是一个基于 Axios 的 HTTP 请求工具,专为 Nuxt 3 应用设计,支持服务端渲染和客户端请求。它提供了请求缓存、统一错误处理等高级功能。
特性
- ✅ 完全类型化的 API
- ✅ 服务端渲染支持 (SSR)
- ✅ 请求缓存机制(基于 Nuxt useAsyncData)
- ✅ 统一错误处理(自动显示错误通知)
- ✅ 防抖错误通知(3秒内相同消息不重复提示)
- ✅ 自动身份验证处理(401 自动跳转登录)
安装
该组件已经集成在项目中,无需额外安装。
基本用法
导入
typescript
import {useAxiosFetch} from "~/composables/useAxiosFetch"GET 请求
typescript
const {data, error} = await useAxiosFetch("/api/users", {
method: "GET",
params: {page: 1},
})POST 请求
typescript
const {data, error} = await useAxiosFetch("/api/users", {
method: "POST",
data: {
name: "John",
email: "john@example.com",
},
})PUT 请求
typescript
const {data, error} = await useAxiosFetch("/api/users/1", {
method: "PUT",
data: {
name: "Updated Name",
},
})DELETE 请求
typescript
const {data, error} = await useAxiosFetch("/api/users/1", {
method: "DELETE",
})配置选项
typescript
interface RequestOptions {
// Axios配置
data?: any // 请求体数据
params?: Record<string, any> // URL参数
method?: string // HTTP方法
headers?: Record<string, string> // 请求头
baseURL?: string // 基础URL
timeout?: number // 超时时间(毫秒)
// Nuxt useAsyncData配置
server?: boolean // 是否在服务端执行(默认true)
lazy?: boolean // 是否延迟执行(默认false)
immediate?: boolean // 是否立即执行(默认true)
deep?: boolean // 是否深度监听(默认false)
watch?: any[] | false // 监听依赖
transform?: (input: any) => any // 转换函数
pick?: string[] // 选择字段
default?: () => any // 默认值函数
}响应类型
typescript
interface RequestResponse<T> {
data: T | null // 响应数据
error: any // 错误对象
}错误处理
useAxiosFetch 会自动处理错误并在前端显示错误通知:
- 401 未授权:自动跳转到登录页
- 404 未找到:显示"Resource Not Found"错误
- 其他错误:显示"Server Error"错误
错误通知有3秒防抖机制,相同错误消息在短时间内只会显示一次。
请求缓存
useAxiosFetch 使用 Nuxt 的 useAsyncData 实现请求缓存。缓存键由以下因素组成:
- URL
- HTTP 方法
- 请求参数
- 请求体数据
这确保了相同的请求会从缓存中读取,提高性能。
最佳实践
1. 使用类型参数
typescript
interface User {
id: number
name: string
email: string
}
const {data} = await useAxiosFetch<User>("/api/users/1")
// data 的类型为 User | null2. 在组件中使用
vue
<template>
<div v-if="!data">加载中...</div>
<div v-else-if="error">出错了: {{ error.message }}</div>
<div v-else>{{ data }}</div>
</template>
<script setup>
const {data, error} = await useAxiosFetch("/api/users")
</script>3. 组合多个请求
typescript
const [users, posts] = await Promise.all([
useAxiosFetch("/api/users", {method: "GET"}),
useAxiosFetch("/api/posts", {method: "GET"})
])
// 访问数据
const userData = users.data
const postsData = posts.data4. 动态请求
vue
<script setup>
import {ref} from "vue"
import {useAxiosFetch} from "~/composables/useAxiosFetch"
const users = ref(null)
async function fetchUsers(page: number = 1) {
const {data} = await useAxiosFetch(`/api/users?page=${page}`, {
method: "GET",
})
users.value = data
}
// 初始加载
fetchUsers()
</script>注意事项
- 服务端渲染(SSR)支持:默认情况下,请求会在服务端执行
- 401 错误会自动跳转到登录页
- 错误通知有3秒防抖机制
- 缓存基于 URL、方法、参数和数据的组合
- 建议使用类型参数以获得更好的类型提示
技术细节
统一响应格式
API 响应应遵循以下格式:
json
{
"code": 0,
"message": "success",
"data": {}
}code: 0表示成功code !== 0表示业务错误
全局配置
以下配置在 useAxiosFetch 中全局设置:
typescript
{
baseURL: process.env.HOST, // 从环境变量读取
timeout: 10000, // 10秒超时
headers: {
'Content-Type': 'application/json',
},
}