vue实现suspense
Vue 3 中实现 Suspense
Suspense 是 Vue 3 引入的一个内置组件,用于处理异步依赖的加载状态。它允许在等待异步组件或异步数据加载时显示一个后备内容(fallback),直到异步操作完成。
基本用法
Suspense 需要与异步组件或 async setup() 一起使用。以下是一个基本示例:
<template>
<Suspense>
<template #default>
<AsyncComponent />
</template>
<template #fallback>
<div>Loading...</div>
</template>
</Suspense>
</template>
<script>
import { defineAsyncComponent } from 'vue'
const AsyncComponent = defineAsyncComponent(() =>
import('./components/AsyncComponent.vue')
)
export default {
components: {
AsyncComponent
}
}
</script>
使用 async setup()
Suspense 也可以与组件的 async setup() 一起使用,处理异步数据加载:
<template>
<Suspense>
<template #default>
<UserProfile />
</template>
<template #fallback>
<div>Loading user data...</div>
</template>
</Suspense>
</template>
<script>
import { ref } from 'vue'
export default {
components: {
UserProfile: {
async setup() {
const user = await fetchUserData()
return { user }
},
template: '<div>{{ user.name }}</div>'
}
}
}
async function fetchUserData() {
// 模拟 API 调用
return new Promise(resolve => {
setTimeout(() => {
resolve({ name: 'John Doe' })
}, 2000)
})
}
</script>
错误处理
可以使用 onErrorCaptured 钩子捕获 Suspense 中的错误:
<template>
<div v-if="error">{{ error.message }}</div>
<Suspense v-else @error-captured="handleError">
<!-- ... -->
</Suspense>
</template>
<script>
import { ref } from 'vue'
export default {
setup() {
const error = ref(null)
const handleError = (err) => {
error.value = err
return false // 阻止错误继续向上传播
}
return { error, handleError }
}
}
</script>
嵌套 Suspense
Suspense 可以嵌套使用,每个 Suspense 可以有自己的加载状态:
<template>
<Suspense>
<template #default>
<ParentComponent />
</template>
<template #fallback>
<div>Loading parent...</div>
</template>
</Suspense>
</template>
<script>
const ParentComponent = {
template: `
<div>
<Suspense>
<template #default>
<ChildComponent />
</template>
<template #fallback>
<div>Loading child...</div>
</template>
</Suspense>
</div>
`,
components: {
ChildComponent: defineAsyncComponent(() =>
import('./ChildComponent.vue')
)
}
}
</script>
注意事项
- Suspense 是一个实验性功能,在 Vue 3 中稳定,但在未来版本中可能会有变化
- 只能在有异步依赖的情况下使用 Suspense
- 在 SSR 中使用 Suspense 需要特别注意,确保服务器和客户端渲染一致
- 对于简单的加载状态,可能不需要使用 Suspense,普通的 v-if 或加载状态变量可能更简单
通过合理使用 Suspense,可以显著改善用户界面在异步加载时的体验,提供平滑的过渡和清晰的加载状态反馈。







