当前位置: 首页 > article >正文

Vue3 Suspense:处理异步渲染过程

什么是 Vue3 Suspense?

<Suspense> 是一个内置组件,用来在组件树中协调对异步依赖的处理。它让我们可以在组件树上层等待下层的多个嵌套异步依赖项解析完成,并可以在等待时渲染一个加载状态。

Vue3 Suspense 是 Vue.js(v3.2.0+)中引入的新特性,旨在提高用户体验,使得页面的加载状态更加平滑。与传统的 Loading Component 不同,Suspense 可以直接控制应用程序的状态,而不需要渲染任何 DOM。

Vue3 Suspense 是 Vue3 的一个新特性,可以优化和改善异步组件的加载过程。Vue3 Suspense 可以让我们从异步加载组件的方式中摆脱回调函数或 promise 链式调用的方式,取而代之的是使用统一的懒加载语法,将所有的异步组件声明分离出来。

当组件被加载时,如果节点还未准备好,则强制组件渲染进入暂停状态。这样可以使页面更平滑,用户不会感受到页面刷新的过程。

在 Vue 中,可以将组件通过 import 函数动态导入:

const Foo = () => import('./Foo.vue')

但是由于异步加载的组件需要一定的时间才能完成加载,因此在加载过程中页面可能会处于空白状态,这样就会给用户带来不好的体验。

在 Vue3 中,可以通过使用 Suspense 来解决这个问题。 Suspense 可以定义一些占位符,用于在异步组件加载完成前展示内容,并且可以在异步组件加载完成后自动切换到真正的组件。

Vue3 Suspense 如何优化异步组件加载?

异步请求并行加载

Vue3 Suspense 允许并行加载多个异步组件,而不是像之前版本中那样按顺序一个个加载。这样可以减少等待时间,提高加载速度和用户体验。

在以下示例中,可以看到异步组件的加载是并行的。

<template>
  <div>
    <h1>{{ message }}</h1>
    <suspense>
      <template #default>
         <async-component></async-component>
         <async-component></async-component>
         <async-component></async-component>
      </template>
      <template #fallback>
        Loading...
      </template>
    </suspense>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import AsyncComponent from './AsyncComponent.vue'

const message = ref('Hello, World!')
</script>

</script>

在上面的代码中,定义了三个异步组件并行加载,这意味着它们将同时下载,并且不必等待前一个组件下载完成才开始下一个动态组件的下载。当组件被加载时,如果它们还没有准备好,Vue3 Suspense 会将组件渲染进入暂停状态,直到它们准备好,然后一起进行处理。

让异步组件懒加载并提前预取

Vue3 Suspense 中的另一个优化技术是让异步组件懒加载并执行提前预取。
通过懒加载,只有在使用时才会加载组件,而不是在页面初始加载时就把所有组件都加载好。
通过执行提前预取,可以在没有等待用户点击前提前加载组件,以确保在需要时可以立即使用。
以下示例演示了如何在 Vue3 Suspense 中懒加载并执行提前预取异步组件:

<template>
  <div>
    <h1>{{ message }}</h1>
    <suspense>
      <template #default>
        <async-component></async-component>
      </template>
      <template #fallback>
        Loading...
      </template>
    </suspense>
  </div>
</template>

<script setup>
import { ref, onMounted } from 'vue'
import AsyncComponent from './AsyncComponent.vue'

const message = ref('Hello, World!')

onMounted(async () => {
  const component = await AsyncComponent()
  component.__requestInterception = true // 开启拦截,提前预取
  component.__navigate('preload') // 提前预取
})
</script>


在上面的代码中,定义了一个异步组件,并在 onMounted 生命周期钩子函数中执行了提前预取操作。这样做可以在用户交互之前,即页面加载时就预先请求好组件,以提高用户体验。

如何在 Vue3 中使用 Suspense?

要使用 Vue3 Suspense,我们需要遵循以下三个基本步骤:

  1. 使用 标记包裹异步组件。
  2. 在默认的 标签中声明包含异步组件的标记。
  3. 在fallback 的 标签中加入等待的提示信息。

以下是一个简单的 Vue3 Suspense 示例:

<template>
  <div>
    <h1>{{ message }}</h1>
    <suspense>
      <template #default>
        <async-component></async-component>
      </template>
      <template #fallback>
        Loading...
      </template>
    </suspense>
  </div>
</template>

<script setup>
import { ref } from 'vue'
import AsyncComponent from './AsyncComponent.vue'

const message = ref('Hello, World!')
</script>

在上面的代码段中,首先使用 标记包裹了异步组件。然后,在默认模板标签中,声明了要渲染的异步组件,同时在 fallback 的模板标签中加入了“Loading…”提示信息。
在 Vue3 Suspense 中,用户体验更加友好,因为它可以让用户看到一个较为友好的提示信息,告诉用户正在努力加载,这样就不会让用户感到程序出现了错误或者挂起。

总结

Vue3 Suspense 是 Vue3 的一个新特性,它可以优化和改善异步组件的加载过程并提高用户体验。通过并行加载和懒加载并执行提前预取等技术,Vue3 Suspense 可以减少等待时间,提高加载速度。

使用 Vue3 Suspense 非常简单,只需要在模板中使用 标记包裹异步组件,并在默认的模板标签中声明异步组件,并在 fallback 的模板标签中加入等待提示信息。

在实际应用程序中,可以根据自己的需要结合其他技术来优化异步组件的加载。例如,可以将其与 Vue Router 和 Vuex 结合使用,来达到更好的效果。在使用 Suspense 时,需要注意:

  • Suspense 组件必须包裹需要异步加载的组件。
  • 需要定义 fallback 模板,用于在异步组件加载完成前展示 Loading 状态。
  • 可以使用 Teleport 元素将组件渲染到指定的 DOM 节点中。
  • 需要根据具体情况,结合 Vue Router 和 Vuex 构建完整的异步组件加载方案。

http://www.kler.cn/a/454532.html

相关文章:

  • 强化学习基础之贝尔曼期望方程
  • Spring事务回滚
  • Excel无法插入新单元格怎么办?有解决方法吗?
  • 【CSS in Depth 2 精译_094】16.2:CSS 变换在动效中的应用(下)——导航菜单的文本标签“飞入”特效与交错渲染效果的实现
  • Jmeter下载安装配置教程(多版本)
  • RTOS 基础知识
  • 力扣-数据结构-4【算法学习day.75】
  • EleutherAI/pythia-70m
  • 联通移动大内网如何使用plex流媒体服务器
  • 讲一个自己写的 excel 转 html 的 java 工具
  • 三只脚的电感是什么东西?
  • Unity2021.3.16f1可以正常打开,但是Unity2017.3.0f3却常常打开闪退或者Unity2017编辑器运行起来就闪退掉
  • 更改 pnpm 的全局存储位置
  • User Script Sandboxing作用 及 在iOS项目中获取GitCommitHash
  • MacOS安装Xcode(非App Store)
  • 2-197 基于matlab的生物地理学优化算法(BBO)在无人机三维航迹规划中的应用
  • Nature+Science=ONNs(光学神经网络)
  • html文件通过script标签引入外部js文件,但没正确加载的原因
  • 1_H5视频播放器-1 -- [前端开发之道:通过实例掌握编程思维]
  • Centos7配置webrtc-streamer环境
  • 识别后端返回的字符串中携带的空格 以及换行 要在前端展示 v-html
  • Python初识
  • MySQL从入门到入土---MySQL表的约束 (内含实践)---详细版
  • 火山引擎边缘云全面升级智能边缘,推动 AI 应用场景拓展与技术创新
  • K8s 常用资源介绍
  • clickhouse测试报告