Spin加载组件在Vue3中为什么无法自动隐藏?
在用Ant Design Vue的Spin组件时遇到了奇怪的问题。当我发起API请求时显示加载状态没问题,但请求成功后设置loading为false,旋转图标却一直不消失。我确认后端接口确实返回了数据,console.log(loading)也显示变成false了,但界面就是卡在加载状态。尝试过手动重渲染和改用v-if控制显示,但都不行。
这是我的代码:
内容区域
import { ref } from 'vue';
const loading = ref(true);
async function fetchData() {
loading.value = true;
try {
await someApiCall();
} finally {
loading.value = false; // 这里确实执行了
}
}
难道是Spin组件和v-if有冲突?或者需要额外触发更新?求大神指教具体排查方向...
loading变了但 Spin 没正确响应响应式更新。Vue3 的响应式在某些场景下会因为引用没变导致子组件不重新渲染,虽然你用了 ref 应该没问题,但 Ant Design Vue 的 Spin 对 loading 的监听可能不够敏感。推荐的做法是不要只依赖
loading控制,而是用:spinning显式绑定布尔值。Spin 组件的文档里明确写了spinning才是控制旋转状态的核心 props,而直接用 v-model 或 v-if 包裹容易出问题。把模板改成这样:
同时确保
fetchData调用时确实在更新同一个loading引用。如果你是在 setup 里定义的loading和fetchData,那就没问题。另外别忘了函数执行后要真的调一下fetchData(),我见过太多人忘了调用。还有一个小概率问题是 someApiCall 抛了错但被吞了,可以加个 catch 打印 error 看看是不是异步异常导致 finally 没走。不过既然你说 finally 执行了那应该不是这问题。
先改用
:spinning,这符合 Ant Design Vue 官方文档的最佳实践,基本能解决 90% 的 Spin 不隐藏问题。