Vue 3 中 Suspense 不生效是怎么回事?
我在用 Vue 3 的 Suspense 包裹一个异步组件,但页面直接白屏,loading 状态也没显示出来,是不是哪里写错了?
我试过把 setup 里加 await,也确认子组件用了 defineAsyncComponent,但还是不行。
<template>
<Suspense>
<template #default>
<AsyncChild />
</template>
<template #fallback>
<div>加载中...</div>
</template>
</Suspense>
</template>
很多人有个误区,以为用了 defineAsyncComponent 就能让 Suspense 生效,其实不是的。defineAsyncComponent 只是延迟加载组件文件,而 Suspense 等待的是组件 setup 里抛出的 Promise。
你的子组件得这么写,用 top-level await:
或者用 async setup 的写法:
这样 Suspense 才能捕获到这个 Promise,在等待期间显示 fallback 内容。
另外还有个常见坑,如果异步请求失败了会白屏。Suspense 只管等待,不管错误。错误需要配合 onErrorCaptured 或者 ErrorBoundary 来处理,不然异步报错直接崩掉。
简单加个错误处理:
检查一下你的 AsyncChild 组件,setup 里有没有真正的 await 语句,没有的话 Suspense 没东西可等,自然 fallback 也不会显示。
如果还是白屏,大概率是子组件内部报错了,打开控制台看下有没有未捕获的 promise rejection。