异步组件的 loading 与 error 状态需合理控制时机、统一反馈、避免碎片化:loading 推荐 delay: 200ms 阈值并用骨架屏;error 应提供重试、分类处理;优先用 suspense 统一管理;timeout 须配合 errorcomponent 且可智能重试。

异步组件的 loading 与 error 状态不是“加了就行”,关键在于让用户感知合理、不被打扰、出错有退路。核心是控制时机、统一反馈、避免状态碎片化。
loading 状态:别让转圈圈成为默认体验
短时间加载完成却硬塞一个 loading,反而破坏流畅感。推荐用 delay 控制显示阈值:
- 设 delay: 200 —— 大多数组件在 200ms 内加载完,用户完全无感
- 只在真正需要等待时才展示 loading,比如图表、富文本编辑器等体积较大或依赖网络的组件
- loadingComponent 应轻量,建议用骨架屏(Skeleton)或极简 Spinner,避免嵌套异步逻辑
error 状态:失败不是终点,而是交互起点
单纯显示“加载失败”等于放弃用户。errorComponent 要提供明确动作:
- 内置重试按钮,点击后调用 retry()(需在 onError 回调中支持)
- 区分错误类型:404 可引导返回首页,超时可自动重试 1–2 次,网络异常提示检查连接
- errorComponent 推荐带图标+简短文案+操作按钮,不依赖外部状态,自身可独立渲染
优先用 Suspense 统一管理,而非每个组件单独配
多个异步组件共存时,分散配置 loading/error 会导致页面视觉混乱(多个 spinner 同时转)。Suspense 提供更自然的协调机制:
- 顶层
<suspense></suspense>包裹整块区域,#fallback 显示统一加载态 - 所有子级异步组件(包括 defineAsyncComponent 和 setup 中 await 的逻辑)都纳入同一 pending/rejected 流程
- 配合
defineAsyncComponent({ suspensible: false })可手动退出 Suspense 控制,用于特殊场景(如必须立即展示占位内容)
超时与重试:要有底线,也要有弹性
timeout 不是越长越好,也不是设了就万事大吉:
- 设 timeout: 5000 是较稳妥的起点;移动端可略放宽至 8000ms
- 必须搭配 errorComponent 才生效;若只设 timeout 不设 errorComponent,超时也不会触发 fallback
- onError 回调里可做智能重试:记录 attempts 次数、判断 error 类型、决定 retry 还是 fail











