我的编程空间,编程开发者的网络收藏夹
学习永远不晚

React18 中的 Suspense API使用实例详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

React18 中的 Suspense API使用实例详解

什么是新的 ReactJS Suspense API,什么时候应该使用它?

何时使用:当组件开始变大并且您在同一页面上有许多组件时,您可能希望开始优化下载到客户端浏览器的方式和时间。

为此,React 为您提供了lazyAPI,它允许您将组件标记为lazy,这意味着被lazy包裹的组件,将会在第一次真正使用时被加载,而不是页面初始化的时候。

懒加载优化是减少“首屏渲染时间”和其他指标的绝妙方法,这些指标主要是用于衡量应用程序首次渲染所需的时间以及“准备好”交互所需的时间。

但是当你使用这种优化时,你会遇到一个问题:如果组件下载时间过长会发生什么?尤其是在网速较慢的情况下。在这种情况下,界面应该展示什么?即使用户看不到,我们该如何让用户知道当前界面正在发生的事情呢?

这就是 Suspense API 发挥作用的地方,让我们来看看吧!

什么是Suspense API?

Suspense API 与“lazy”组件结合使用时,可以让用户知道,此时当前界面正在后台加载某些内容。 当浏览器在下载需要懒加载的这个组件的过程中,提供替代可视化(不同的组件)来做到这一点。

这里的前提是,这个替代组件(一般loading组件)是一个较低的较小的,并且很可能可以在许多不同的地方重复使用的组件。这样话,权衡是有意义的。

对于本文,我创建了一个 Github 存储库,在分支react18-suspense中!

使用时,需要你简单地用 Suspense 包装你的lazy组件,同时指定 fallback 属性。像这样:

import React, { Suspense, useState } from "react";
import Waiting from "./waiting";
const Text = React.lazy(() => import("./text"));
const Buttons = React.lazy(() => import("./buttons"));
export default function Tabs() {
  const [tab, setTab] = useState("text");
  return (
    <Suspense fallback={<Waiting />}>
        <div style={{ minWidth: "40vw" }}>
        <p>
          <a
            href="#" rel="external nofollow"  rel="external nofollow" 
            onClick={(_) => {
              if (tab == "text") setTab("buttons");
              else setTab("text");
            }}
          >
            Toggle to {tab === "text" ? "buttons" : "text"}
          </a>
        </p>
        <div style={{ minWidth: "40vw" }}>
          {tab === "text" ? <Text /> : <Buttons />}
        </div>
      </div>
    </Suspense>
  );
}

从以上代码中可以看出,Text 和 Buttons 组件都是会懒加载的,加载它们中的任何一个都需要向服务器发出请求。点击 “Toggle”,可以在两者之间交替。

现在有趣的是,Suspense 组件不必直接包装懒加载的组件。它们可以在树的多个层次上,无论如何都会显示fallback。所以你不必担心用它包装每一个组件,你可以包装你的组件树的整个部分,并让它们都使用相同的fallback。

看上面的 GIF图,它以白屏开始,因为它下载初始页面的速度很慢(请注意“网络”选项卡上的“slow 3G”设置)。紧接着,我们会看到“Waiting...”消息,这就是 Waiting fallback。

然后它被一条文本消息替换,即加载的文本组件。我们在这里看到了 Suspense API 的实际应用。

然后,当我单击“切换”链接时,将再次看到“waiting...”消息几秒钟,而浏览器正在第一次下载按钮组件。

在此之后,组件之间的切换是立即执行的,因为它们已经加载,并且不再需要 Suspense API。

如果你想了解更多关于 Suspense 的信息,我建议你阅读此处的 RFC,因为它为你提供了理解该功能所需的所有上下文。

什么是 transition API?

有兴趣的可以移步这篇介绍useTransition的文章!

作为 React 18 的一部分,Suspense API 增加了一个,它允许您以在某些情况下可能对用户更友好的方式在组件之间进行转换。

如果你回到我们的示例,会注意到,每次单击“Toggle”时,点击之前的旧组件消失了,取而代之的是界面上要么显示最新组件,要么显示“waiting...”,这样的交互,可能对用户来说变化太大了,因此我们可能希望保持点击之前,依然保持旧组件可见,并让用户可以与旧组件进行交互,同时 React在后台加载新组件。只有在新组件准备好后,它才会用它替换旧组件。

现在,您可以在 React 18 中使用 useTransition API 执行此操作,如下所示:

import React, { Suspense, useState, useTransition } from "react";
import Waiting from "./waiting";
const Text = React.lazy(() => import("./text"));
const Buttons = React.lazy(() => import("./buttons"));
export default function Tabs() {
  const [tab, setTab] = useState("text");
  const [isPending, startTransition] = useTransition();
  return (
    <Suspense fallback={<Waiting />}>
      <div style={{ minWidth: "40vw" }}>
        <p>
          <a
            href="#" rel="external nofollow"  rel="external nofollow" 
            onClick={(_) => {
              startTransition(() => {
                if (tab == "text") setTab("buttons");
                else setTab("text");
              });
            }}
          >
            My Toggle to {tab === "text" ? "buttons" : "text"}
          </a>
        </p>
        <div style={{ opacity: isPending ? 0.1 : 1, minWidth: "40vw" }}>
          {tab === "text" ? <Text /> : <Buttons />}
        </div>
      </div>
    </Suspense>
  );
}

这是完全相同的代码,但是现在当我们单击“Toggle”时,我们调用 startTransition 来切换tab,这样告诉 React 只有在加载完成后才替换组件。

因为缺少了loading状态,可能会让用户有点困惑,所以我们可以从 useTransition 钩子返回的 isPending 中获取。这个isPending可以用来表示当前组件正在发生一些事情,而不会完全破坏用户的体验。在我的例子中,我将“旧”组件的不透明度设置为“0.1”,同时加载“新”组件。

现在,如果要运行此示例,你将看到第一次刷新页面的时候触发了fallback,然后每当用户手动单击“Toggle”时,都会调用startTransition。这为用户提供了更好的体验,并且仍然尽可能优化。

最后

Suspense API 并不复杂,也不会给你现有的项目添加太多代码。但是,如果你的应用程序不够复杂,你可能不需要使用它。

要确定代码中是否应该使用,我们应该问自己的第一个问题是:我在每个页面上渲染了多少个组件,以及为此加载了多少个组件?要分析我们的应用程序的性能,并确定这些组件是否确实导致了一些初始加载时间问题。如果是这样,那么行的,开始代码拆分并引入吧!否则,你可以不使用也没事。

以上就是React18 中的 Suspense API使用实例详解的详细内容,更多关于React18 Suspense API的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

React18 中的 Suspense API使用实例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

React18 中的 Suspense API使用实例详解

这篇文章主要为大家介绍了React18 中的 Suspense API使用实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2022-11-13

Vue3异步组件Suspense的使用方法详解

这篇文章主要介绍了Vue3异步组件Suspense的使用方法详解,需要的朋友可以参考下
2023-01-28

python中API调用的详解与示例

本篇文章给大家带来了关于python的相关知识,其中主要介绍了关于API调用的相关问题,包括了API的调用和数据接口的调用、请求方法、几种常见API调用实例等等内容,下面一起来看一下,希望对大家有帮助。在日常工作中,可能需要结合网上现在的一些API或者公司提供的数据接口来得到相应的数据或者实现对应的功能。 因此API的调用和数据接口的访问都是做数据分析的一个常用操作,如何快速实现API和数据接口的调
2022-06-16

Java实现调用ElasticSearch API的示例详解

这篇文章主要为大家详细介绍了Java调用ElasticSearch API的效果资料,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的可以了解一下
2023-03-02

Golang中Append()使用实例详解

今天在刷leetcode的时候,第113题让我遇到了一个Go语言中append函数的一个坑,所以复习下,这篇文章主要给大家介绍了关于Golang中Append()使用的相关资料,需要的朋友可以参考下
2023-01-12

Vue中createElement使用实例详解

Vue提供了createElement来创建虚拟dom,方便我们来函数化的方式来定义复杂的组件结构,这篇文章主要介绍了Vue中createElement使用详解,需要的朋友可以参考下
2022-11-13

KotlinViewModelProvider.Factory的使用实例详解

这篇文章主要介绍了KotlinViewModelProvider.Factory的使用,在我们使用ViewModel的时候,我们会发现,有的时候我们需要用到ViewModelFactory,有的时候不需要
2023-02-17

Android 中CheckBox的isChecked的使用实例详解

Android 中CheckBox的isChecked的使用实例详解 范例说明所有的网络服务在User使用之前,都需要签署同意条款,在手机应用程序、手机游戏的设计经验中,常看见CheckBox在同意条款情境的运用,其选取的状态有两种即isC
2022-06-06

php中RESTful API的使用方法详解

RESTfulAPI在PHP中的使用详解,从定义资源、选择HTTP方法到处理请求和优化性能,文章全面介绍了构建RESTfulAPI的步骤和工具。此外,还探讨了安全性考虑因素、文档化和版本控制的重要性。通过本文,读者可以掌握PHP中RESTfulAPI的使用方法,并构建高性能、安全的Web应用程序。
php中RESTful API的使用方法详解
2024-04-02

Java使用ChatGPT的API详解

OpenAIAPI几乎可以应用于任何涉及理解或生成自然语言或代码的任务。本文将带你们介绍Java如何使用ChatGPT的API,感兴趣的同学可以跟着小编一起来学习
2023-05-18

Java中泛型使用实例详解

Java中泛型使用泛型作用:泛型:集合类添加对象不用强转反射机制:将泛型固定的类的所有方法和成员全部显示出来 核心代码:ArrayList ff=new ArrayList();Ls ls1=new Ls("薯片",5f);
2023-05-31

项目中使用TypeScript的TodoList实例详解

这篇文章主要为大家介绍了项目中使用TypeScript的TodoList实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-01-04

mysql中json_extract的使用方法实例详解

目录一、前言二、创建示例表三、基本语法- 获取jsON对象中某个key对应的value值- 获取JSON数组中某个元素- 获取JSON中的嵌套数据四、渐入佳境- 获取JSON多个路径的数据- 路径表达式*的使用- 返回NULL值- 返回错误
2023-04-13

vue中使用echarts的方法实例详解

这篇文章主要介绍了vue中使用echarts的方法,结合实例形式详细分析了vue中使用echarts的包安装、引入、生命周期函数元素挂载等相关操作技巧与使用注意事项,需要的朋友可以参考下
2023-05-19

vue3 使用defineExpose的实例详解

这篇文章主要介绍了vue3 使用defineExpose的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-19

编程热搜

目录