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

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

相关文章:

  • Vivado版本控制
  • Android Studio 添加so无法打包进apk问题
  • Go语言实现大模型分词器tokenizer
  • UniApp项目中 使用微信小程序原生语言 进行开发
  • flutter开发实战-实现获取视频的缩略图封面video_thumbnail
  • 主机安全-WindowsLinux的SSH安全加固
  • 解锁 ElasticJob 云原生实践的难题
  • 有权图的最短路径算法
  • 快速筛出EXCEL行中的重复项
  • Android flutter项目 启动优化实战(一)使用benchmark分析项目
  • SQL Server 2016(分离和附加数据库)
  • P1 什么是链表 C语言简单易懂
  • MOS管的静电击穿问题
  • 2023年12月03日新闻简报(国内国际)
  • 机器学习中参数优化或交叉验证评估指标含义
  • CSS中外联样式表代表的含义
  • Git同步原始仓库到Fork仓库中
  • maven工程打包jar以及java jar命令的classpath使用
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • Octave 入门
  • spring security oauth2 password授权模式
  • tab.js分享及浏览器兼容性问题汇总
  • Vue实战(四)登录/注册页的实现
  • webgl (原生)基础入门指南【一】
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 订阅Forge Viewer所有的事件
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 微服务核心架构梳理
  • 我的zsh配置, 2019最新方案
  • 正则表达式小结
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​ArcGIS Pro 如何批量删除字段
  • !!java web学习笔记(一到五)
  • #pragam once 和 #ifndef 预编译头
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (floyd+补集) poj 3275
  • (Matlab)使用竞争神经网络实现数据聚类
  • (TOJ2804)Even? Odd?
  • (定时器/计数器)中断系统(详解与使用)
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • :=
  • @font-face 用字体画图标
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • []指针
  • [AIGC] 如何建立和优化你的工作流?
  • [Android] 240204批量生成联系人,短信,通话记录的APK
  • [Asp.net mvc]国际化