Vue 3 骨架屏加载状态管理核心是精准控制显隐时机:created 启动请求并激活骨架屏,mounted 优化 DOM 相关展示,Suspense 声明式接管异步逻辑,provide/inject 实现跨组件全局 loading 统一控制。

Vue 3 中管理骨架屏加载状态,关键不是“等数据回来再显示内容”,而是“在正确的时间点告诉 UI:现在该展示占位、现在该切换真实内容”。生命周期钩子就是这个时间控制器——它不直接渲染骨架屏,但决定了骨架屏何时出现、何时退场。
created:启动请求 + 激活骨架屏
这是最常用也最稳妥的起点。组件实例已创建,响应式系统就绪,但 DOM 还没挂载,不会触发渲染异常。
- 在 setup() 或 onCreated 中,把 loading 状态设为 true(例如 const loading = ref(true))
- 立刻调用 API 方法(如 fetchData()),并在请求完成回调里设 loading.value = false
- 模板中用 v-if="loading" 渲染骨架屏组件,此时 DOM 尚未存在,完全安全
mounted:不发主请求,专注 DOM 相关微调
mounted 不适合发起首次数据请求——用户已经看到空白或骨架屏,再拉数据会延长感知等待;但它适合让骨架屏更贴合实际布局。
从零开始编排 SpringBoot+Vue 全栈项目工作流,适用于新建全栈项目或完整脚手架请求,触发后依次调用 product‑spec‑builder(需求调研)等模块。
- 比如读取某个容器的真实高度,动态设置骨架屏中占位块的 min-height
- 初始化需要操作 DOM 的第三方库(如 ECharts 容器准备就绪后才初始化图表)
- 监听窗口 resize,在大屏/移动端下调整骨架屏的列数或间距
Suspense:声明式接管,省去手动状态管理
Vue 3 推荐方案,本质是把“异步性”提升到组件层级,由框架自动协调显隐逻辑。
- 用 defineAsyncComponent 包裹真实内容组件(如 Dashboard.vue)
- 用
包裹它,并在 #fallback 插槽放骨架屏 - 无需定义 loading ref,也不用 watch 或事件同步状态——组件加载、出错、超时都自动响应
provide/inject:跨组件统一控制全局 loading
适用于多页共用一套骨架逻辑的中后台系统,避免每个页面重复写 loading 状态。
- 在 App.vue 或 pinia store 中定义 globalLoading = ref(true)
- 通过 provide('globalLoading', globalLoading) 向下传递
- 各页面用 inject('globalLoading') 获取,并在数据就绪后统一设为 false
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










