在组合式 api 中,用 ref 管理加载状态需语义清晰、可复用、解耦业务逻辑,推荐使用字符串枚举('idle'/'pending'/'success'/'error')替代布尔值,并封装为 useloading 工具函数统一管理状态流转与自动清理。

在组合式 API 中,用 ref 管理加载状态的关键是:**语义清晰、可复用、与业务逻辑解耦,且避免硬编码布尔值**。它不单是写个 isLoading = ref(false) 就完事,而是要让状态变化可追踪、可组合、易测试。
明确加载状态的三种典型形态
加载不是非黑即白的 true/false,实际场景中常需区分:
-
未开始(如初始空态,
loading = ref('idle')) -
进行中(
loading.value = 'pending') -
完成或失败(
loading.value = 'success'或'error')
用字符串枚举比布尔值更能表达意图,也方便后续扩展(比如加 loading 文案、图标映射等)。
封装成可复用的 loading 工具函数
把加载逻辑抽离为 useLoading,避免每个组件重复声明和重置:
import { ref, onUnmounted } from 'vue'
export function useLoading(initial = 'idle') {
const loading = ref(initial)
const start = () => (loading.value = 'pending')
const succeed = () => (loading.value = 'success')
const fail = () => (loading.value = 'error')
const reset = () => (loading.value = initial)
// 自动清理(可选)
onUnmounted(reset)
return {
loading,
start,
succeed,
fail,
reset
}
}
在组件中直接解构使用:
使用 `@ainative/vue-sdk` 为 Vue 3 应用添加 AI 聊天功能。适用于以下场景:(1) 安装 `@ainative/vue-sdk`,(2) 在 Vue 组件中使用 `useChat` 组合式函数,(3) 提供……
const { loading, start, succeed, fail } = useLoading()
async function fetchUser() {
start()
try {
const data = await api.getUser()
succeed()
} catch (err) {
fail()
}
}
配合模板自动解包与条件渲染
利用 Vue 模板对 ref 的自动解包特性,写法更简洁自然:
<template><button :disabled="loading === 'pending'">
<span v-if="loading === 'pending'">加载中...</span>
<span v-else>获取用户</span>
</button>
<div v-if="loading === 'success'">✅ 数据已就绪</div>
<div v-else-if="loading === 'error'">❌ 加载失败,请重试</div>
</template>
不需要写 loading.value,模板里直接用 loading 即可——这是 ref 在组合式 API 中真正“优雅”的体现之一。
进阶:支持多任务独立加载状态
当一个页面有多个异步操作(如同时拉取用户 + 权限 + 配置),可用对象结构管理:
const loadings = reactive({
user: 'idle',
permissions: 'idle',
config: 'idle'
})
// 使用时
loadings.user = 'pending'
// 模板中:v-if="loadings.user === 'pending'"
但若仍想坚持 ref 风格,也可创建多个 useLoading 实例:
const userLoading = useLoading() const permLoading = useLoading() const configLoading = useLoading()
这样每个状态完全隔离,互不影响,适合高内聚低耦合的模块设计。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!









