Suspense 是 Vue 3 内置组件,用于声明式处理异步组件加载的占位展示;必须直接包裹异步组件,并同时提供 #default 和 #fallback 插槽,支持骨架屏等高级方案且自动协调加载状态。
Suspense 是 Vue 3 提供的内置组件,专为处理异步组件加载时的占位展示而设计。它不手动控制 loading 状态,而是通过声明式插槽自动协调“加载中”与“加载完成”两个阶段,让页面过渡更自然、代码更简洁。
使用 Suspense 时,有几点硬性规则不能跳过:
<Suspense> 的直接子元素,不能嵌套在 div 或其他容器里#default 和 #fallback 两个具名插槽defineAsyncComponent() 定义,或内部 setup 返回 Promise(如含 await)这是最常用也最推荐的写法,清晰且无副作用:
<template><Suspense><template #default><AsyncUserProfile /></template><template #fallback><div class="skeleton-profile"></div></template></Suspense></template><script setup>import { defineAsyncComponent } from 'vue'const AsyncUserProfile = defineAsyncComponent(() => import('./components/AsyncUserProfile.vue'))</script>
比起简单文字提示,“骨架屏”能保持布局稳定、提升感知速度。Suspense 天然适配这类方案:
#fallback 中写一个结构相似的灰色占位组件,CSS 控制宽高和动画实际开发中容易踩的几个坑:
<Suspense> —— 异步组件会渲染为空白,控制台报 warning