vue 3 首屏骨架屏配置核心是真实内容前用结构一致的灰色占位块撑起布局,避免白屏与跳动;推荐按场景分三级落地:element plus 内置 skeleton(最快)、路由级自定义组件(结构精准)、图片级独立控制(防闪退),ssr 场景可直出骨架 html。

Vue 3 项目配置首屏骨架屏,核心是“在真实内容渲染前,用结构一致的灰色占位块撑起页面布局”,避免白屏和跳动。不依赖复杂构建流程,重点在于时机控制、结构匹配和渐进替换。
用 Element Plus 内置 Skeleton 组件(最简落地)
适合中后台系统,已有 Element Plus 依赖时最快启用:
- 在需要加载态的页面区域,用 v-if="loading" 控制显示逻辑,加载完成后再切到真实内容
- 基础写法:
<el-skeleton v-if="loading" :rows="4" animated></el-skeleton>,:rows数值建议与实际列表/卡片行数一致 - 复杂结构用
#template插槽自定义:比如带头像+三行文字的用户列表项,可嵌套<el-skeleton-item variant="circle"></el-skeleton-item>和多个variant="text" -
loading 状态必须由业务逻辑驱动,例如 API 请求开始设为 true,
.finally(() => loading.value = false)结束,不能靠定时器模拟
按路由粒度定制骨架屏组件(结构精准)
当首页或关键路由布局较复杂(如含图表、多栏卡片、轮播图),内置 Skeleton 难以还原结构时适用:
- 在
src/components下新建SkeletonHome.vue,用纯 div + class 模拟真实 DOM 层级和宽高比例 - 样式尽量复用项目现有 CSS 变量(如
--el-color-primary、间距类),保证视觉连贯 - 在对应页面中引入并条件渲染:
<skeletonhome v-if="loading"></skeletonhome><homecontent v-else></homecontent> - 注意:该组件本身不应包含任何异步逻辑或副作用,只做静态占位
图片级骨架屏控制(防闪退关键)
单张图片加载慢易导致骨架屏“一闪而过”,必须独立管理每张图的状态:
- 每个图片卡片内用
const isLoaded = ref(false),并在onMounted中创建Image实例监听onload - 不要在父组件用一个
isLoaded控制所有图片——否则某张图提前加载完,整组骨架就消失了 - 推荐封装成可复用组件,如
KLoadingImage.vue,接收src、width、height参数,内部完成加载状态切换 - 若需更稳表现,可在
onload后加setTimeout(..., 100)微调,避免因渲染队列导致的瞬时闪烁
服务端渲染(SSR)场景下的骨架屏注入
使用 Vue SSR 且希望首屏直出骨架 HTML 时(进一步消除白屏):
- 利用 Vue 官方
vue-server-renderer的createBundleRenderer,配合 Webpack 插件在构建时将骨架屏组件注入 HTML 模板 - 骨架屏组件需满足 SSR 友好:无浏览器 API(如
window)、无副作用、使用defineComponent显式声明 - 服务端返回的 HTML 已含骨架结构,客户端激活(hydrate)后才替换为真实内容,体验更顺滑
- 注意缓存策略:骨架屏 HTML 可静态缓存,但需确保与客户端版本一致,否则 hydration 失败
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










