useApiFetch

View source
基于 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 继承 Nuxt useFetch 的所有功能,同时提供额外的 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 }))
})
如果响应中不存在 dataKey 字段,会回退返回完整响应对象。dataKey 字段名可通过模块配置自定义。

业务状态码检查

$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 集成选项。

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(包含 statusCoderesponseisBusinessError 属性)。
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
execute
(opts?: { dedupe?: boolean }) => Promise<void>
refresh 的别名。手动执行请求(常用于 immediate: false 时)。
clear
() => void
清空状态。将 data 设为 nullerror 设为 nullstatus 设为 'idle'

Changelog

Soon
  • dba0c — feat: 新增 useLazyApiFetch 并重构文档结构
v1.1.0
  • 6ebb7 — refactor(api): 更新运行时实现以适配新配置架构
v1.0.0
  • 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 + $api
  • 419b5 — feat(api): 添加自定义 API Fetch 框架
Copyright © 2025 - 2026 YiXuan - MIT License