Vue3中的Suspense组件有什么用?

简介: Vue3中的Suspense组件有什么用?

什么是Suspense

官网是这样解释的:<Suspense> 是一个内置组件,用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异步依赖项解析完成,并可以在等待时渲染一个加载状态。意思就是一个用于处理异步组件的特殊组件。为了在异步组件加载的过程中展示一些占位内容,而不是直接等待组件加载完成,为了提高用户体验,使得页面的加载状态更加平滑。

如何与异步交互

<Suspense> 的工作方式是,当包裹的异步组件(或异步引用)开始加载时,它会渲染 fallback 插槽中的内容。一旦异步组件加载完成,它将替换 fallback 插槽中的内容,显示实际的组件内容。

通过这种方式,<Suspense> 提供了一种优雅的方式来处理异步组件加载,在开发过程中就可以更好地控制和呈现与异步依赖相关的 UI。<Suspense> 组件主要解决的问题是在处理异步组件加载时提供更好的用户体验,它能够:

  1. 展示占位内容: 在异步组件加载过程中,<Suspense> 允许你提供一个占位内容(通过 fallback 插槽),使用户在等待组件加载时看到一些有意义的内容,而不是空白或加载提示。
  2. 简化异步组件的逻辑: 在没有 <Suspense> 的情况下,处理异步组件加载需要开发者手动管理 loading 状态、错误处理等。而使用 <Suspense> 可以让这些逻辑更集中、更容易理解和维护。

在与异步依赖进行交互时,<Suspense> 通常与以下方式结合使用:

  1. 异步组件:<Suspense> 中包裹异步组件,使得在组件加载的过程中能够显示指定的占位内容。
<template>
  <Suspense>
    <template #default>
      <AsyncComponent />
    </template>
    <template #fallback>
      <div>Loading...</div>
    </template>
  </Suspense>
</template>
  1. <script setup> 中的异步引用: 在 Vue 3 中,使用 <script setup> 语法,可以在 setup 函数中使用异步引用(import())加载组件或模块。
<template>
  <Suspense>
    <template #default>
      <AsyncComponent />
    </template>
    <template #fallback>
      <div>Loading...</div>
    </template>
  </Suspense>
</template>

<script setup>
  import { ref } from 'vue';
  const AsyncComponent = import('./AsyncComponent.vue');
</script>

异步加载状态

<Suspense> 组件在处理异步加载时有三种状态:idlependingerror。这些状态用于跟踪异步组件的加载过程。

  1. idle 状态: 初始状态,表示异步组件没有开始加载。
  2. pending 状态: 表示异步组件正在加载中。在这个状态下,<Suspense> 会渲染 fallback 插槽中的内容,即占位符。
  3. error 状态: 表示异步组件加载过程中发生了错误。在这个状态下,<Suspense> 会渲染 fallback 插槽中的内容,通常用于显示加载失败的信息。

这些状态可以通过 suspense 全局 API 或者 setup 函数中的 ref 属性进行访问和控制。


<template>
  <Suspense>
    <template #default>
      <AsyncComponent />
    </template>
    <template #fallback>
      <div v-if="status === 'pending'">Loading...</div>
      <div v-else-if="status === 'error'">Error!</div>
    </template>
  </Suspense>
</template>

<script>
import { ref, onMounted } from 'vue';

export default {
  setup() {
    const status = ref('idle');

    // 模拟异步加载
    const loadAsyncComponent = () => {
      status.value = 'pending';
      import('./AsyncComponent.vue')
        .then(() => {
          status.value = 'idle';
        })
        .catch(() => {
          status.value = 'error';
        });
    };

    // 在组件挂载时执行异步加载
    onMounted(() => {
      loadAsyncComponent();
    });

    return { status };
  },
};
</script>

在这个例子中,通过 status 变量来跟踪异步加载状态。当状态为 pending 时,显示加载中的提示;当状态为 error 时,显示加载错误的提示。在异步加载完成后,状态变为 idle,此时显示实际的异步组件内容。

小结

Vue3 Suspense 是 Vue3 的一个新特性,它可以优化和改善异步组件的加载过程并提高用户体验。通过并行加载和懒加载并执行提前预取等技术,它可以减少等待时间,提高加载速度。使用也很简单,只需要将需要用Suspense组件包裹需要异步加载的组件就行。需要定义 fallback 模板,用于在异步组件加载完成前展示 Loading 状态。

目录
相关文章
|
9天前
|
JavaScript API
Vue3中的计算属性能否动态修改
【9月更文挑战第5天】Vue3中的计算属性能否动态修改
40 10
|
2天前
|
JavaScript
Vue3中路由跳转的语法
Vue3中路由跳转的语法
105 58
|
5天前
|
前端开发
vue3+ts项目中使用mockjs
vue3+ts项目中使用mockjs
198 58
|
2天前
|
JavaScript 开发工具
vite如何打包vue3插件为JSSDK
【9月更文挑战第10天】以下是使用 Vite 打包 Vue 3 插件为 JS SDK 的步骤:首先通过 `npm init vite-plugin-sdk --template vue` 创建 Vue 3 项目并进入项目目录 `cd vite-plugin-sdk`。接着,在 `src` 目录下创建插件文件(如 `myPlugin.js`),并在 `main.js` 中引入和使用该插件。然后,修改 `vite.config.js` 文件以配置打包选项。最后,运行 `npm run build` 进行打包,生成的 `my-plugin-sdk.js` 即为 JS SDK,可在其他项目中引入使用。
|
3天前
|
JavaScript 开发者
彻底搞懂 Vue3 中 watch 和 watchEffect是用法
彻底搞懂 Vue3 中 watch 和 watchEffect是用法
|
9天前
|
JavaScript API
如何使用Vue3的可计算属性
【9月更文挑战第5天】如何使用Vue3的可计算属性
42 13
vue3 reactive数据更新,视图不更新问题
vue3 reactive数据更新,视图不更新问题
|
9天前
|
资源调度 JavaScript API
vue3 组件通信方式
vue3 组件通信方式
39 11
|
1天前
|
JavaScript
|
1天前
vue3定义暴露一些常量
vue3定义暴露一些常量