Spin加载组件在Vue3中为什么无法自动隐藏?

海霞🍀 阅读 20

在用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有冲突?或者需要额外触发更新?求大神指教具体排查方向...

我来解答 赞 6 收藏
二维码
手机扫码查看
1 条解答
极客爱军
你这个情况大概率是 loading 变了但 Spin 没正确响应响应式更新。Vue3 的响应式在某些场景下会因为引用没变导致子组件不重新渲染,虽然你用了 ref 应该没问题,但 Ant Design Vue 的 Spin 对 loading 的监听可能不够敏感。

推荐的做法是不要只依赖 loading 控制,而是用 :spinning 显式绑定布尔值。Spin 组件的文档里明确写了 spinning 才是控制旋转状态的核心 props,而直接用 v-model 或 v-if 包裹容易出问题。

把模板改成这样:

<a-spin :spinning="loading">
<div>内容区域</div>
</a-spin>


同时确保 fetchData 调用时确实在更新同一个 loading 引用。如果你是在 setup 里定义的 loadingfetchData,那就没问题。另外别忘了函数执行后要真的调一下 fetchData(),我见过太多人忘了调用。

还有一个小概率问题是 someApiCall 抛了错但被吞了,可以加个 catch 打印 error 看看是不是异步异常导致 finally 没走。不过既然你说 finally 执行了那应该不是这问题。

先改用 :spinning,这符合 Ant Design Vue 官方文档的最佳实践,基本能解决 90% 的 Spin 不隐藏问题。
点赞 1
2026-02-12 20:00