骨架屏应优先用 v-show;因其仅切换 display,避免 dom 销毁重建与重排,配合 css 动画更顺滑,且需设最小展示时间防闪动,手写比插件更可控。

uni-app 里骨架屏该用 v-show 还是 v-if?
骨架屏本质是「占位」,不是真实内容。用 v-if 会导致 DOM 频繁销毁重建,页面重排加重;而 v-show 只切 display,过渡更顺滑,也方便配合 CSS 动画控制显隐节奏。
- 骨架结构建议提前写在模板里,初始状态设为
v-show="loading" -
loading用响应式变量控制,接口返回后设为false,再由nextTick触发真实内容渲染(避免闪动) - 不要等
onLoad完全结束才显示骨架——数据还没请求时就该让它出现,否则白屏感明显
uni-app 中怎么让骨架动画「看起来在加载」?
纯静态骨架没意义,关键靠 CSS 模拟「流动感」。uni-app 的 view 组件支持 background-image 和 animation,但要注意平台差异:
- H5 端可直接用
linear-gradient+animation做波浪光效 - 微信小程序端不支持
background-image动画,得换思路:用两个半透明色块叠加,通过transform: translateX()错位移动模拟扫描效果 - App 端(iOS/Android)对
transform性能友好,但别在骨架里嵌太多text或image标签,会触发重绘卡顿
示例片段(H5 可用):
.skeleton-item {
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200% 100%;
animation: loading 1.5s infinite;
}
@keyframes loading {
0% { background-position: 200% 0; }
100% { background-position: -200% 0; }
}
uni-app 页面跳转时骨架屏「闪一下又消失」怎么解决?
这是最常见的坑:新页面刚进入、骨架还没渲染完,数据就回来了,v-show 切得太快,用户看到的是「骨架 → 白屏 → 内容」三段式。
- 必须加最小展示时间,比如
setTimeout(() => loading = false, 300),哪怕数据秒回也撑住 300ms - 更稳妥的做法是结合
onReady:先设loading = true,等onReady触发后再发请求,避免生命周期错位 - 如果用了
uni.navigateTo带参数传数据,别在目标页直接读取,而是统一走接口——否则骨架逻辑和数据流脱节
用插件(如 uni-skeleton)还是手写?
目前社区的 uni-skeleton 插件只适配 H5,小程序端兼容性差,且无法自定义区块宽高比;手写虽然多几行 CSS,但可控性强、体积小、无额外依赖。
- 手写骨架推荐按区块拆:头图、标题、段落、卡片,每个用固定
height+border-radius模拟 - 不要用
flex: 1或百分比高度,uni-app 在某些安卓 WebView 下计算不准,导致骨架塌陷 - 如果页面有下拉刷新,骨架区域必须包裹在
scroll-view外层,否则刷新时骨架会跟着滚动错位
复杂点在于不同端的渲染时机不一致,特别是小程序真机调试时,setData 节流会让骨架延迟一帧出现——这点容易被忽略,得在真机上反复测。











