useApiFetch
基于 Nuxt useFetch 封装的 API 请求 composable,提供自动认证、业务状态码检查和 Toast 提示。
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 提示,支持自定义配置。
数据解包
$api 会自动解包 API 响应中 dataKey 对应的字段(默认为 data),useApiFetch 接收到的已经是解包后的业务数据:
// 泛型 T 直接声明业务数据类型(即 data 字段的类型)
const { data } = await useApiFetch<User>('/user')
// data.value = { id: 1, name: 'test' }
// 结合 transform 做二次转换
const { data } = await useApiFetch<{ content: User[] }, SelectItem[]>('/users', {
transform: ({ content }) => content.map(u => ({ label: u.name, value: u.id }))
})
业务状态码检查
$api 拦截器会自动检查业务状态码(由模块配置的 response 选项控制)。当业务状态码不在 successCodes 中时,会抛出 ApiError 并显示 Toast:
// 业务状态码错误
{
code: 400,
message: '用户名已存在'
}
// 自动抛出 ApiError,显示 Toast: "用户名已存在"
// error.value 包含 statusCode、response、isBusinessError 等信息
skipBusinessCheck: true 会跳过业务状态码校验(不会抛出 ApiError),但仍然会解包 dataKey 字段:
const { data } = await useApiFetch('/external', {
skipBusinessCheck: true
})
// 不校验 code 是否在 successCodes 中
// 但仍会提取 response[dataKey](无该字段时回退到完整响应)
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
}
}
})
API
useApiFetch()
useApiFetch<T = unknown, DataT = T>(url: string | (() => string), options?: UseApiFetchOptions<T, DataT>): UseApiFetchReturn<DataT>
创建 API 请求。
Parameters
url
string | (() => string) required
请求 URL 或返回 URL 的函数。支持响应式 URL。
options
UseApiFetchOptions<T, DataT>
请求配置选项。支持所有 Nuxt
useFetch 选项,以及额外的 API 集成选项。API 集成选项
endpoint
string
使用指定的端点配置。默认使用
$api 的默认端点。toast
RequestToastOptions | false
Toast 提示配置。设为
false 禁用 Toast。success
Partial<ToastProps> | false
成功提示配置。可以是完整的 Toast 属性对象,或
false 禁用成功提示。error
Partial<ToastProps> | false
错误提示配置。可以是完整的 Toast 属性对象,或
false 禁用错误提示。successMessage
string
成功提示的快捷文本。等价于
success: { title: '...' }。errorMessage
string
错误提示的快捷文本。等价于
error: { title: '...' }。skipBusinessCheck
boolean
跳过业务状态码检查(不抛出
ApiError),但仍会解包 dataKey 字段。默认 false。请求选项 (继承自 useFetch)
method
'GET' | 'HEAD' | 'PATCH' | 'POST' | 'PUT' | 'DELETE' | 'CONNECT' | 'OPTIONS' | 'TRACE'
HTTP 请求方法。默认
'GET'。query
Record<string, any>
URL 查询参数,会自动序列化到 URL。
params
Record<string, any>
query 的别名。body
RequestInit['body'] | Record<string, any>
请求体。对于 POST/PUT/PATCH 请求,会自动序列化为 JSON。
headers
Record<string, string> | [key: string, value: string][] | Headers
请求头。
baseURL
string
基础 URL。通常通过
endpoint 选项配置,无需手动设置。响应处理
transform
(input: T) => DataT | Promise<DataT>
转换响应数据的函数。接收已解包的业务数据,返回最终数据。
pick
string[]
仅选择响应数据的指定字段。
default
() => DataT
设置默认值的工厂函数。
执行选项
immediate
boolean
是否立即执行请求。设为
false 时需手动调用 execute()。默认 true。lazy
boolean
是否使用 lazy 模式。lazy 模式下不会阻塞客户端导航,数据在后台加载。默认
false。server
boolean
是否在服务端执行请求。默认
true。watch
MultiWatchSources
监听的响应式源,变化时自动重新请求。可以是 ref、reactive 对象或数组。
deep
boolean
是否深度监听
watch 的对象。默认 true。缓存与去重
key
string
自定义缓存键。用于多个请求之间共享数据或去重。
dedupe
'cancel' | 'defer'
重复请求的处理策略。默认
cancel'cancel'- 取消待处理的请求'defer'- 不发起新请求
getCachedData
(key: string) => DataT
从缓存中获取数据的函数。返回值将用作初始
data。请求钩子
onRequest
(context: FetchContext) => Promise<void> | void
请求发送前的钩子。与内置钩子合并执行。
onRequest({ request, options }) {
console.log('发送请求:', request.url)
}
onRequestError
(context: FetchContext & { error: Error }) => Promise<void> | void
请求错误时的钩子。与内置钩子合并执行。
onRequestError({ request, error }) {
console.error('请求错误:', error)
}
onResponse
(context: FetchContext & { response: Response }) => Promise<void> | void
收到响应时的钩子。与内置钩子合并执行。
onResponse({ response }) {
console.log('收到响应:', response.status)
}
onResponseError
(context: FetchContext & { response: Response }) => Promise<void> | void
响应错误时的钩子(4xx/5xx)。与内置钩子合并执行。
onResponseError({ response }) {
console.error('响应错误:', response.status)
}
Type Parameters
T
type
业务数据类型(已由
$api 自动解包)。即 API 响应中 data 字段的数据类型。DataT
type
transform 转换后的最终类型。默认等于 T。Returns
返回 useFetch 的响应对象,包含以下属性:
data
Ref<DataT | null>
响应数据(已解包和转换)。初始值为
null,请求成功后更新为实际数据。error
Ref<FetchError | ApiError | null>
错误对象。网络错误为
FetchError,业务状态码错误为 ApiError(包含 statusCode、response、isBusinessError 属性)。status
Ref<'idle' | 'pending' | 'success' | 'error'>
请求状态。
'idle'- 尚未开始(仅immediate: false时)'pending'- 请求进行中'success'- 请求成功'error'- 请求失败
pending
Ref<boolean>
是否正在请求中。等价于
status.value === 'pending'。refresh
(opts?: { dedupe?: boolean }) => Promise<void>
刷新数据,重新执行请求。别名:
execute。// 刷新数据
await refresh()
// 跳过去重检查,强制刷新
await refresh({ dedupe: false })
execute
(opts?: { dedupe?: boolean }) => Promise<void>
refresh 的别名。手动执行请求(常用于 immediate: false 时)。clear
() => void
清空状态。将
data 设为 null、error 设为 null、status 设为 'idle'。Changelog
Soon
dba0c— feat: 新增 useLazyApiFetch 并重构文档结构
f2709— refactor(api): 重构 API 配置架构并新增上传下载组件277ea— refactor(useApiFetch): 重构 API 请求模块架构6e8f3— chore: 🔧 更新文档、示例与自动生成的类型b31fb— fix(useApiFetch): 修复 useClientApiFetch 立即执行问题3bffb— feat(api): 重构 useApiFetch 基于 useFetch 和自定义 $fetch 实例87762— refactor(api): 重构 useApiFetch 基于 useAsyncData + $api419b5— feat(api): 添加自定义 API Fetch 框架