欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

React18?中的?Suspense?API使用實(shí)例詳解

 更新時(shí)間:2022年10月24日 08:56:39   作者:github_is_geeksKai  
這篇文章主要為大家介紹了React18?中的?Suspense?API使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是新的 ReactJS Suspense API,什么時(shí)候應(yīng)該使用它?

何時(shí)使用:當(dāng)組件開始變大并且您在同一頁(yè)面上有許多組件時(shí),您可能希望開始優(yōu)化下載到客戶端瀏覽器的方式和時(shí)間。

為此,React 為您提供了lazyAPI,它允許您將組件標(biāo)記為lazy,這意味著被lazy包裹的組件,將會(huì)在第一次真正使用時(shí)被加載,而不是頁(yè)面初始化的時(shí)候。

懶加載優(yōu)化是減少“首屏渲染時(shí)間”和其他指標(biāo)的絕妙方法,這些指標(biāo)主要是用于衡量應(yīng)用程序首次渲染所需的時(shí)間以及“準(zhǔn)備好”交互所需的時(shí)間。

但是當(dāng)你使用這種優(yōu)化時(shí),你會(huì)遇到一個(gè)問題:如果組件下載時(shí)間過長(zhǎng)會(huì)發(fā)生什么?尤其是在網(wǎng)速較慢的情況下。在這種情況下,界面應(yīng)該展示什么?即使用戶看不到,我們?cè)撊绾巫層脩糁喇?dāng)前界面正在發(fā)生的事情呢?

這就是 Suspense API 發(fā)揮作用的地方,讓我們來看看吧!

什么是Suspense API?

Suspense API 與“lazy”組件結(jié)合使用時(shí),可以讓用戶知道,此時(shí)當(dāng)前界面正在后臺(tái)加載某些內(nèi)容。 當(dāng)瀏覽器在下載需要懶加載的這個(gè)組件的過程中,提供替代可視化(不同的組件)來做到這一點(diǎn)。

這里的前提是,這個(gè)替代組件(一般loading組件)是一個(gè)較低的較小的,并且很可能可以在許多不同的地方重復(fù)使用的組件。這樣話,權(quán)衡是有意義的。

對(duì)于本文,我創(chuàng)建了一個(gè) Github 存儲(chǔ)庫(kù),在分支react18-suspense中!

使用時(shí),需要你簡(jiǎn)單地用 Suspense 包裝你的lazy組件,同時(shí)指定 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 組件都是會(huì)懶加載的,加載它們中的任何一個(gè)都需要向服務(wù)器發(fā)出請(qǐng)求。點(diǎn)擊 “Toggle”,可以在兩者之間交替。

現(xiàn)在有趣的是,Suspense 組件不必直接包裝懶加載的組件。它們可以在樹的多個(gè)層次上,無論如何都會(huì)顯示fallback。所以你不必?fù)?dān)心用它包裝每一個(gè)組件,你可以包裝你的組件樹的整個(gè)部分,并讓它們都使用相同的fallback。

看上面的 GIF圖,它以白屏開始,因?yàn)樗螺d初始頁(yè)面的速度很慢(請(qǐng)注意“網(wǎng)絡(luò)”選項(xiàng)卡上的“slow 3G”設(shè)置)。緊接著,我們會(huì)看到“Waiting...”消息,這就是 Waiting fallback。

然后它被一條文本消息替換,即加載的文本組件。我們?cè)谶@里看到了 Suspense API 的實(shí)際應(yīng)用。

然后,當(dāng)我單擊“切換”鏈接時(shí),將再次看到“waiting...”消息幾秒鐘,而瀏覽器正在第一次下載按鈕組件。

在此之后,組件之間的切換是立即執(zhí)行的,因?yàn)樗鼈円呀?jīng)加載,并且不再需要 Suspense API。

如果你想了解更多關(guān)于 Suspense 的信息,我建議你閱讀此處的 RFC,因?yàn)樗鼮槟闾峁┝死斫庠摴δ芩璧乃猩舷挛摹?/p>

什么是 transition API?

有興趣的可以移步這篇介紹useTransition的文章!

作為 React 18 的一部分,Suspense API 增加了一個(gè),它允許您以在某些情況下可能對(duì)用戶更友好的方式在組件之間進(jìn)行轉(zhuǎn)換。

如果你回到我們的示例,會(huì)注意到,每次單擊“Toggle”時(shí),點(diǎn)擊之前的舊組件消失了,取而代之的是界面上要么顯示最新組件,要么顯示“waiting...”,這樣的交互,可能對(duì)用戶來說變化太大了,因此我們可能希望保持點(diǎn)擊之前,依然保持舊組件可見,并讓用戶可以與舊組件進(jìn)行交互,同時(shí) React在后臺(tái)加載新組件。只有在新組件準(zhǔn)備好后,它才會(huì)用它替換舊組件。

現(xiàn)在,您可以在 React 18 中使用 useTransition API 執(zhí)行此操作,如下所示:

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>
  );
}

這是完全相同的代碼,但是現(xiàn)在當(dāng)我們單擊“Toggle”時(shí),我們調(diào)用 startTransition 來切換tab,這樣告訴 React 只有在加載完成后才替換組件。

因?yàn)槿鄙倭薼oading狀態(tài),可能會(huì)讓用戶有點(diǎn)困惑,所以我們可以從 useTransition 鉤子返回的 isPending 中獲取。這個(gè)isPending可以用來表示當(dāng)前組件正在發(fā)生一些事情,而不會(huì)完全破壞用戶的體驗(yàn)。在我的例子中,我將“舊”組件的不透明度設(shè)置為“0.1”,同時(shí)加載“新”組件。

現(xiàn)在,如果要運(yùn)行此示例,你將看到第一次刷新頁(yè)面的時(shí)候觸發(fā)了fallback,然后每當(dāng)用戶手動(dòng)單擊“Toggle”時(shí),都會(huì)調(diào)用startTransition。這為用戶提供了更好的體驗(yàn),并且仍然盡可能優(yōu)化。

最后

Suspense API 并不復(fù)雜,也不會(huì)給你現(xiàn)有的項(xiàng)目添加太多代碼。但是,如果你的應(yīng)用程序不夠復(fù)雜,你可能不需要使用它。

要確定代碼中是否應(yīng)該使用,我們應(yīng)該問自己的第一個(gè)問題是:我在每個(gè)頁(yè)面上渲染了多少個(gè)組件,以及為此加載了多少個(gè)組件?要分析我們的應(yīng)用程序的性能,并確定這些組件是否確實(shí)導(dǎo)致了一些初始加載時(shí)間問題。如果是這樣,那么行的,開始代碼拆分并引入吧!否則,你可以不使用也沒事。

以上就是React18 中的 Suspense API使用實(shí)例詳解的詳細(xì)內(nèi)容,更多關(guān)于React18 Suspense API的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React中常用的一些鉤子函數(shù)總結(jié)

    React中常用的一些鉤子函數(shù)總結(jié)

    這篇文章給大家總結(jié)了React中常用的一些鉤子函數(shù),文中通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • React?數(shù)據(jù)共享useContext的實(shí)現(xiàn)

    React?數(shù)據(jù)共享useContext的實(shí)現(xiàn)

    本文主要介紹了React?數(shù)據(jù)共享useContext的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • React Native基礎(chǔ)入門之初步使用Flexbox布局

    React Native基礎(chǔ)入門之初步使用Flexbox布局

    React中引入了flexbox概念,flexbox是屬于web前端領(lǐng)域CSS的一種布局方案,下面這篇文章主要給大家介紹了關(guān)于React Native基礎(chǔ)入門之初步使用Flexbox布局的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • react字符串匹配關(guān)鍵字高亮問題

    react字符串匹配關(guān)鍵字高亮問題

    這篇文章主要介紹了react字符串匹配關(guān)鍵字高亮問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Reactjs實(shí)現(xiàn)通用分頁(yè)組件的實(shí)例代碼

    Reactjs實(shí)現(xiàn)通用分頁(yè)組件的實(shí)例代碼

    這篇文章主要介紹了Reactjs實(shí)現(xiàn)通用分頁(yè)組件的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧
    2017-01-01
  • react-redux及redux狀態(tài)管理工具使用詳解

    react-redux及redux狀態(tài)管理工具使用詳解

    Redux是為javascript應(yīng)用程序提供一個(gè)狀態(tài)管理工具集中的管理react中多個(gè)組件的狀態(tài)redux是專門作狀態(tài)管理的js庫(kù)(不是react插件庫(kù)可以用在其他js框架中例如vue,但是基本用在react中),這篇文章主要介紹了react-redux及redux狀態(tài)管理工具使用詳解,需要的朋友可以參考下
    2023-01-01
  • React項(xiàng)目配置axios和反向代理和process.env環(huán)境配置等問題

    React項(xiàng)目配置axios和反向代理和process.env環(huán)境配置等問題

    這篇文章主要介紹了React項(xiàng)目配置axios和反向代理和process.env環(huán)境配置等問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • React中使用antd組件的方法

    React中使用antd組件的方法

    antd?是基于?Ant?Design?設(shè)計(jì)體系的?React?UI?組件庫(kù),主要用于研發(fā)企業(yè)級(jí)中后臺(tái)產(chǎn)品,這篇文章主要介紹了React中使用antd組件,需要的朋友可以參考下
    2022-09-09
  • React中useCallback useMemo到底該怎么用

    React中useCallback useMemo到底該怎么用

    在React函數(shù)組件中,當(dāng)組件中的props發(fā)生變化時(shí),默認(rèn)情況下整個(gè)組件都會(huì)重新渲染。換句話說,如果組件中的任何值更新,整個(gè)組件將重新渲染,包括沒有更改values/props的函數(shù)/組件。在react中,我們可以通過memo,useMemo以及useCallback來防止子組件的rerender
    2023-02-02
  • react中(含hooks)同步獲取state值的方式

    react中(含hooks)同步獲取state值的方式

    這篇文章主要介紹了react(含hooks)中同步獲取state值的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評(píng)論