当前位置:首页 > VUE

vue实现suspense

2026-01-12 20:29:12VUE

Vue 3 中实现 Suspense

Suspense 是 Vue 3 新增的一个内置组件,用于处理异步依赖的加载状态。它可以包裹多个异步组件,并在它们解析完成前显示一个后备内容。

基本用法

<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>

与异步 setup 结合使用

当组件使用异步 setup 时,Suspense 可以自动捕获其加载状态:

vue实现suspense

<template>
  <Suspense>
    <template #default>
      <ComponentWithAsyncSetup />
    </template>
    <template #fallback>
      <div>Loading setup...</div>
    </template>
  </Suspense>
</template>

<script>
const ComponentWithAsyncSetup = {
  async setup() {
    const data = await fetchData()
    return { data }
  }
}
</script>

错误处理

可以通过 onErrorCaptured 钩子捕获 Suspense 内部的错误:

<script>
export default {
  setup() {
    const error = ref(null)

    onErrorCaptured((err) => {
      error.value = err
      return true // 阻止错误继续向上传播
    })

    return { error }
  }
}
</script>

嵌套 Suspense

Suspense 组件可以嵌套使用,每个 Suspense 会处理自己范围内的异步依赖:

vue实现suspense

<Suspense>
  <template #default>
    <ParentComponent />
  </template>
  <template #fallback>
    Loading parent...
  </template>
</Suspense>

<!-- ParentComponent.vue -->
<template>
  <Suspense>
    <template #default>
      <ChildComponent />
    </template>
    <template #fallback>
      Loading child...
    </template>
  </Suspense>
</template>

服务器端渲染(SSR)注意事项

在 SSR 环境下,Suspense 的行为略有不同:

  • 服务器会立即渲染 fallback 内容
  • 客户端会等待异步组件解析后再进行水合
  • 需要确保服务器和客户端的结果匹配

性能优化技巧

对于多个异步组件,可以使用 Promise.all 来并行加载:

const AsyncComponentA = defineAsyncComponent(() => 
  import('./A.vue')
)
const AsyncComponentB = defineAsyncComponent(() => 
  import('./B.vue')
)

// 在父组件中并行加载
Promise.all([
  AsyncComponentA.load(),
  AsyncComponentB.load()
])

注意事项

  1. Suspense 是一个实验性功能,API 可能在未来的 Vue 版本中变化
  2. 目前不支持在 Suspense 中使用 keep-alive
  3. 错误边界处理需要显式配置
  4. 在路由切换场景下,可能需要结合 router-view 使用

标签: vuesuspense
分享给朋友:

相关文章

vue公共列表的实现

vue公共列表的实现

实现 Vue 公共列表组件 公共列表组件通常用于展示重复结构的数据,例如商品列表、用户列表等。以下是一个典型的实现方式: 基础实现 创建可复用的列表组件 List.vue: <tem…

vue 实现复选

vue 实现复选

Vue 实现复选功能 在 Vue 中实现复选功能可以通过多种方式完成,以下是常见的几种方法: 使用 v-model 绑定数组 通过 v-model 绑定一个数组,可以自动收集用户选择的复选框值。…

vue实现https

vue实现https

Vue 中实现 HTTPS 的步骤 在 Vue 项目中实现 HTTPS 主要涉及开发环境配置和生产环境部署。以下是具体方法: 开发环境配置(Vue CLI 或 Vite) 使用 mkcert 生成…

vue实现xss

vue实现xss

XSS 攻击简介 XSS(跨站脚本攻击)是一种常见的安全漏洞,攻击者通过注入恶意脚本到网页中,当其他用户访问该页面时,脚本会在其浏览器中执行,可能导致数据泄露或会话劫持。 Vue 中的 XSS…

vue分类实现

vue分类实现

Vue分类实现方法 在Vue中实现分类功能通常涉及数据分组、动态渲染和交互逻辑。以下是几种常见的实现方式: 基于计算属性的分类 通过计算属性对原始数据进行分组处理,适合静态或少量数据分类: c…

vue实现复选

vue实现复选

Vue 实现复选框 在 Vue 中实现复选框可以通过 v-model 指令绑定数据,同时结合 input 元素的 type="checkbox" 属性来实现。以下是几种常见的实现方式: 单个复选框…