Vue 3 组合式函数 useLoading 将骨架屏加载状态抽象为可复用、响应式逻辑单元,通过 ref(true) 初始化、start/finish 方法控制、nextTick 延迟关闭、provide/inject 共享及 TypeScript 类型约束,确保加载状态与数据流和 DOM 渲染严格对齐。

Vue 3 组合式函数处理骨架屏加载状态,核心是把「加载中」这个信号抽象为可复用、可注入、可响应的逻辑单元,而不是在每个组件里重复声明 ref(true) 和手动控制开关。关键不在“怎么写一个 loading”,而在于“怎么让 loading 的生命周期与数据流、视图更新严格对齐”。
封装 useLoading:统一管理响应式加载状态
创建一个组合式函数 useLoading(),返回可读写的响应式引用和配套方法:
- 内部用
ref(true)初始化,避免undefined === false导致骨架屏不显示的问题 - 提供
start()和finish()方法,语义清晰,便于追踪调用点 - 支持可选的自动重置:比如传入
{ autoReset: true },在finish()后下一次start()前自动清空状态 - 可搭配
onBeforeUnmount自动清理,防止组件卸载后仍触发状态变更
与异步操作深度绑定:等 DOM 真正就绪再关骨架
单纯等接口返回还不够——数据赋值后,Vue 还需执行响应式更新、虚拟 DOM diff、真实 DOM 渲染。此时关骨架屏,用户可能看到一闪而过的空白。正确做法是:
将静态 Vue 页面(index.vue)改造为动态页面(Custom.vue);稿源仅限 index.vue、其引用的 CSS 与资源路径,禁止参考仓库内其他文件。Invoke when user wants to transform a static Vue page into a dynamic data-driven page with Element UI components.
- 在异步回调里调用
loading.finish()后,立刻包裹nextTick() - 或者直接在
finish()内部集成nextTick,对外隐藏细节 - 例如:
const finish = () => nextTick(() => (loading.value = false))
支持跨组件共享:配合 provide/inject 实现全局加载控制
对于多卡片、多区块的页面(如仪表盘),各模块应共用同一套加载信号,而非各自维护状态:
- 在父组件或布局层调用
const { loading, start, finish } = useLoading() - 通过
provide('globalLoading', { loading, start, finish })注入 - 子组件用
inject('globalLoading')获取,无需重复实例化 - 特别适合「整体页面加载中」+「局部区块刷新中」的混合场景
类型安全加固:明确约束使用边界
用 TypeScript 显式定义输入输出,避免误传或解构失焦:
- 参数支持配置对象:
interface UseLoadingOptions { autoReset?: boolean; default?: boolean } - 返回值类型标注为
{ loading: Ref; start: () => void; finish: () => void } - 如果用于特定业务(如用户列表),可进一步泛型化:
useLoading,为后续扩展留出空间()
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









