Vue 3 中 Suspense 不生效是怎么回事?
我在用 Vue 3 的 Suspense 包裹一个异步组件,但页面一直显示默认内容,fallback 根本没触发。明明组件里用了 await 获取数据,也返回了 Promise,但 Suspense 好像完全没起作用。
我试过把 setup() 改成 async,也确认了子组件是通过 defineAsyncComponent 引入的,但还是不行。是不是哪里写错了?
<template>
<Suspense>
<template #default>
<AsyncUserProfile />
</template>
<template #fallback>
<div>加载中...</div>
</template>
</Suspense>
</template>
首先检查你的异步组件定义方式,一定要用defineAsyncComponent包裹,并且确保加载函数返回的是Promise。最常见的问题其实是组件加载太快了,fallback还没来得及显示就完成了。
你可以这样调整下异步组件定义:
如果还不行,检查这些点:
1. 确保父组件没有用v-if阻止Suspense渲染
2. 检查网络请求确实是在setup里用await进行的
3. 在子组件里可以加个console.log确认Promise确实处于pending状态
另外,async setup写法其实不是必须的,关键是要确保组件内部有异步操作。比如这样写子组件更直观:
我一般会先用setTimeout模拟慢速请求来测试Suspense是否正常工作,确认后再换成真实请求。
解决办法很简单,把异步逻辑直接提到 setup 顶层去 await。
如果你是 Options API,子组件得这么写:
如果你是
语法糖,也是同理,直接在顶层写const data = await ...。只要 setup 没有挂起,Suspense 的 fallback 就永远不会出来。改一下代码逻辑位置就行。