骨架屏在 Vue 里怎么做到数据加载完自动隐藏?
我用 Vue3 写了个商品列表页,想加个骨架屏提升体验。现在问题是:骨架屏显示出来了,但数据加载完成后不知道该怎么让它自动消失。我试过用 v-if 绑定 loading 状态,但有时候接口返回太快,骨架屏闪一下就没了,反而显得更卡。
目前我的结构大概是这样:
<template>
<div v-if="loading">
<!-- 骨架屏组件 -->
<SkeletonItem v-for="i in 5" :key="i" />
</div>
<div v-else>
<ProductItem v-for="item in products" :key="item.id" :data="item" />
</div>
</template>
有没有办法让骨架屏至少显示 300ms,即使数据早就回来了?或者有更好的过渡方案?
思路是:loading 变成 true 后,延迟 300ms 再显示骨架屏;loading 变成 false 时,立即隐藏真实内容,延迟 300ms 再隐藏骨架屏。这样不管接口多快,骨架屏都能保证至少显示 300ms。
直接上代码:
核心逻辑就两点:
1. 用
skeletonVisible单独控制骨架屏显示,loading 变 true 后等 300ms 才显示骨架屏2. 模板里用
v-if="loading || skeletonVisible",这样 loading 变 false 时骨架屏还能保留 300ms如果想更精细控制,可以把 300ms 做成配置项。
这个方案的好处是简单直接,不需要引入额外的过渡组件。复制过去改改接口地址就能用。