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 状态。

目录
相关文章
|
13天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
117 64
|
13天前
|
JavaScript 前端开发 API
Vue 3 中 v-model 与 Vue 2 中 v-model 的区别是什么?
总的来说,Vue 3 中的 `v-model` 在灵活性、与组合式 API 的结合、对自定义组件的支持等方面都有了明显的提升和改进,使其更适应现代前端开发的需求和趋势。但需要注意的是,在迁移过程中可能需要对一些代码进行调整和适配。
|
13天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
24 8
|
13天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
17 1
|
13天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
25 1
|
13天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
JavaScript
Vue的非父子组件之间传值
全局事件总线 一种组件间通信的方式,适用于任意组件间通信
|
缓存 JavaScript 前端开发
Vue Props、Slot、v-once、非父子组件间的传值....
Vue Props、Slot、v-once、非父子组件间的传值....
86 0
|
JavaScript
Vue中父子组件传值
先在⽗组件中给⼦组件的⾃定义属性绑定⼀个⽗组件的变量
|
JavaScript
vue 组件传值
vue 组件传值
84 0