Vue 3 的 Suspense 不捕获加载异常,仅协调等待与就绪状态;异常需通过 errorCaptured、onErrorCaptured 或错误边界处理,fallback 插槽不响应拒绝态,推荐结合 ref 控制错误视图并封装重试逻辑。
Vue 3 的 Suspense 本身不直接捕获或暴露加载异常(比如网络失败、模块解析错误),它只负责协调“等待→就绪”状态。要处理异步组件加载异常,需结合 errorCaptured 钩子、onErrorCaptured 或外层错误边界机制,不能依赖 Suspense 自身的插槽。
Suspense 的 #fallback 插槽只在“等待中”生效,一旦异步操作被拒绝(reject),组件会停止挂载并抛出错误——此时 fallback 不会渲染,页面可能白屏或报错中断。
用 errorCaptured 钩子拦截子组件抛出的异步错误,并降级展示友好提示:
onErrorCaptured(组合式 API)监听子组件错误ref 控制是否显示自定义错误视图,替代默认崩溃行为defineAsyncComponent 的重新加载逻辑示例:
<script setup>import { ref, onErrorCaptured } from 'vue'
import { defineAsyncComponent } from 'vue'
const AsyncUser = defineAsyncComponent(() => import('./User.vue'))
const hasError = ref(false)
onErrorCaptured((err) => {
console.error('异步组件加载失败:', err)
hasError.value = true
return false // 阻止向上传播
})
</script>
<template>
<Suspense>
<template #default>
<AsyncUser v-if="!hasError" />
</template>
<template #fallback>
<div class="skeleton">加载中…</div>
</template>
</Suspense>
<div v-if="hasError" class="error-tip">
加载失败,请检查网络或稍后重试
<button @click="hasError = false">重试</button>
</div>
</template>
把错误重试、超时、兜底逻辑封装进自定义 Hook 或工厂函数,避免每个地方重复写 onErrorCaptured:
defineAsyncComponent({ loader, errorComponent, timeout })(Vue 3.4+ 支持)配置加载超时和错误组件useAsyncComponent,返回加载状态、错误信息、重试函数router.beforeEach 或布局组件中集中拦截异步组件错误某些异常无法被 errorCaptured 捕获,需额外防范:
const data = await fetch(...))→ 必须在 setup() 内 try/catch,否则直接崩onErrorCaptured 拦截virtualbox下怎么实现ubuntu20.04开机自动挂载共享文件夹?
ubuntu20.04怎么开启护眼模式? ubuntu夜间模式的设置方法
如何在Ubuntu 20.04上安装Microsoft Edge浏览器
Ubuntu20.10优麒麟触摸手势有哪些? 优麒麟系统新增手势汇总
优麒麟20.04.1发布 更新内容汇总(附下载)
Mermaid Visual Editor 如何同步可视化操作与 Mermaid 源码?