useApiFetch
Usage
使用自动导入的 useApiFetch composable 进行 API 请求,基于 Nuxt useFetch 封装,提供自动认证、数据解包、业务状态码检查和统一的错误处理。
<script setup lang="ts">
interface User {
id: number
name: string
email: string
}
// 基础用法(自动解包 data 字段)
const { data, pending, error, refresh } = await useApiFetch<User[]>('/users')
// POST 请求
const { data } = await useApiFetch('/users', {
method: 'POST',
body: { name: 'test', email: 'test@example.com' }
})
// 使用其他端点
const { data } = await useApiFetch('/users', { endpoint: 'v2' })
</script>
useApiFetch继承 NuxtuseFetch的所有功能,同时提供额外的 API 集成特性。- 自动从 session 获取 token 并添加到请求头(通过
$api实例)。 - 自动检查业务状态码并抛出错误。
- 内置 Toast 提示,支持自定义配置。
数据解包
useApiFetch 会自动解包 API 响应的 data 字段:
// API 响应格式
{
code: 200,
message: 'Success',
data: { id: 1, name: 'test' } // 这部分会被自动解包
}
// 使用时直接声明 data 字段的类型
const { data } = await useApiFetch<User>('/user')
// data.value = { id: 1, name: 'test' }
如果响应格式不同,可以使用 skipBusinessCheck 跳过解包,或使用 transform 自定义转换逻辑。
业务状态码检查
默认情况下,useApiFetch 会检查业务状态码(通过模块配置的 response 选项):
// 默认配置
{
response: {
codeKey: 'code',
successCodes: [200, 0]
}
}
当业务状态码不匹配时,会自动抛出错误并显示 Toast:
// 业务状态码错误
{
code: 400,
message: '用户名已存在'
}
// 自动抛出错误,显示 Toast: "用户名已存在"
可以通过 skipBusinessCheck: true 禁用此功能:
const { data } = await useApiFetch('/users', {
skipBusinessCheck: true
})
Toast 提示
内置 Toast 提示,支持请求级配置:
// 禁用所有 Toast
const { data } = await useApiFetch('/users', {
toast: false
})
// 仅显示错误提示
const { data } = await useApiFetch('/users', {
toast: { success: false }
})
// 使用快捷文本
const { data } = await useApiFetch('/users', {
toast: {
successMessage: '创建成功!',
errorMessage: '创建失败,请重试'
}
})
// 使用完整的 Toast 属性
const { data } = await useApiFetch('/users', {
toast: {
success: {
title: '创建成功',
description: '用户已添加到系统',
color: 'primary',
icon: 'i-lucide-circle-check'
},
error: {
title: '创建失败',
description: '请检查输入信息',
color: 'danger',
timeout: 5000
}
}
})
自定义 Hooks
支持自定义请求钩子,与内置钩子合并执行:
const { data } = await useApiFetch('/users', {
onRequest({ request, options }) {
console.log('发送请求:', request)
},
onRequestError({ request, error }) {
console.error('请求错误:', error)
},
onResponse({ response }) {
console.log('收到响应:', response._data)
},
onResponseError({ response }) {
console.error('响应错误:', response.status)
}
})
API
useApiFetch()
useApiFetch<ResT = unknown, DataT = ResT>(url: string | (() => string), options?: UseApiFetchOptions<ResT, DataT>): UseApiFetchReturn<DataT>
创建 API 请求。
Parameters
useFetch 选项,以及额外的 API 集成选项。API 集成选项
$api 的默认端点。false 禁用 Toast。false 禁用成功提示。false 禁用错误提示。success: { title: '...' }。error: { title: '...' }。false。请求选项 (继承自 useFetch)
'GET'。query 的别名。endpoint 选项配置,无需手动设置。响应处理
data 字段,返回最终数据。执行选项
false 时需手动调用 execute()。默认 true。pending 为 false。默认 false。true。watch 的对象。默认 true。缓存与去重
cancel'cancel'- 取消待处理的请求'defer'- 不发起新请求
data。请求钩子
onRequest({ request, options }) {
console.log('发送请求:', request.url)
}
onRequestError({ request, error }) {
console.error('请求错误:', error)
}
onResponse({ response }) {
console.log('收到响应:', response.status)
}
onResponseError({ response }) {
console.error('响应错误:', response.status)
}
Type Parameters
data 字段的原始类型。transform 转换后的最终类型。默认等于 ResT。Returns
返回 useFetch 的响应对象,包含以下属性:
null,请求成功后更新为实际数据。'idle'- 尚未开始(仅immediate: false时)'pending'- 请求进行中'success'- 请求成功'error'- 请求失败
status.value === 'pending'。execute。// 刷新数据
await refresh()
// 跳过去重检查,强制刷新
await refresh({ dedupe: false })
refresh 的别名。手动执行请求(常用于 immediate: false 时)。data 设为 null、error 设为 null、status 设为 'idle'。Changelog
6ebb7 — refactor: 更新运行时实现以适配新配置架构
f2709 — refactor: 重构 API 配置架构并新增上传下载组件
277ea — refactor: 重构 API 请求模块架构
6e8f3 — chore: 🔧 更新文档、示例与自动生成的类型
b31fb — fix: 修复 useClientApiFetch 立即执行问题
3bffb — feat: 重构 useApiFetch 基于 useFetch 和自定义 $fetch 实例
87762 — refactor: 重构 useApiFetch 基于 useAsyncData + $api
419b5 — feat: 添加自定义 API Fetch 框架