react路由中Suspense的介紹

好的,我們來詳細解釋一下這個 AppRouter 組件的代碼。

這個組件是一個在現代 React 應用中非常常見的模式,特別是在使用 React Router v6+ 進行路由管理和結合代碼分割(Code Splitting)來優化性能時。

JavaScript

const AppRouter = () => {const element = useRoutes(routes);return <Suspense fallback={<PageLoading />}>{element}</Suspense>;
};

組件功能概述:

AppRouter 組件的核心功能是根據當前的 URL 決定渲染哪個頁面組件,并且在頁面組件(特別是那些通過代碼分割延遲加載的組件)正在加載時顯示一個加載中的提示。

代碼逐行解釋:

  1. const AppRouter = () => { ... };

    • 這定義了一個名為 AppRouter 的函數式 React 組件。
  2. const element = useRoutes(routes);

    • useRoutes 是 React Router v6+ 提供的一個 Hook。
    • 它接收一個 routes 配置數組作為參數。這個 routes 數組通常包含了你的應用中所有路由的定義,比如哪個路徑對應哪個組件。例如: JavaScript

      const routes = [{ path: '/', element: <HomePage /> },{ path: '/about', element: <AboutPage /> }, // 可能是通過 React.lazy 導入的組件{ path: '*', element: <NotFoundPage /> },
      ];
      
    • useRoutes Hook 會讀取當前的 URL,然后在 routes 數組中找到匹配的路由配置。
    • 它返回與當前 URL 匹配的路由配置中 element 對應的 React 元素。換句話說,它會返回應該當前渲染的頁面組件(或 null,如果沒有匹配到)。
    • 所以,element 變量現在 holding 了根據當前 URL 應該顯示的頁面組件。
  3. return <Suspense fallback={<PageLoading />}>{element}</Suspense>;

    • 這是組件的返回值,渲染了核心的路由內容。
    • <Suspense> 是 React 內置的一個組件。它是用于處理異步操作的一種方式,特別常用于代碼分割(Code Splitting)
    • Suspense子組件(在這里是 {element},也就是當前路由匹配到的頁面組件)因為它自身需要的某些資源(例如通過 React.lazy 延遲加載的代碼塊)還沒有加載完成而**暫停渲染(suspends)**時,Suspense 就會捕獲這個暫停。
    • fallback={<PageLoading />}<Suspense> 組件的一個重要屬性。
      • fallback 屬性:它指定了一個在子組件暫停渲染期間需要顯示的備用 UI
      • <PageLoading />:在這個例子中,fallback 的值是一個 <PageLoading /> React 元素。PageLoading 應該是一個你自定義的組件,用來顯示加載中的狀態,比如一個旋轉的加載圖標、一個進度條或者簡單的文本提示。
      • 用法:這意味著當 element(即當前頁面組件)因為代碼正在異步加載而無法立即渲染時,React 會暫時渲染 <PageLoading /> 組件來代替它。一旦 element 所需的代碼加載完成并可以渲染了,Suspense 就會自動切換回渲染 element

Suspense 和 fallback 的作用總結:

  • 當你使用 React.lazy() 來導入一個組件(例如,將每個路由對應的頁面組件都進行 lazy 導入),首次訪問這個組件時,React 需要異步加載對應的 JavaScript 代碼塊。
  • 在代碼塊加載完成之前,React.lazy() 返回的組件會觸發一個“暫停”(suspension)。
  • <Suspense> 組件就是用來捕獲這種暫停的。
  • fallback 屬性則定義了在暫停期間顯示什么內容。
  • 這提供了一種優雅的方式來處理加載狀態,而不是手動管理 loading 狀態變量。

這個 AppRouter 組件的整體工作流程:

  1. 用戶訪問應用的某個 URL。
  2. useRoutes(routes) 根據 URL 找到匹配的路由配置,并返回對應的頁面組件(存儲在 element 中)。這個頁面組件很可能是通過 React.lazy() 異步加載的。
  3. element 被渲染到 <Suspense> 內部。
  4. 如果 element 是一個通過 React.lazy() 導入的組件,并且其代碼正在加載中,它會觸發暫停。
  5. <Suspense> 捕獲這個暫停,并渲染 fallback 屬性指定的內容,即 <PageLoading /> 組件。用戶看到加載提示。
  6. element 所需的代碼加載完成后,React 自動重試渲染 element
  7. 這次 element 可以正常渲染了,<Suspense> 移除 <PageLoading />,并顯示真實的頁面內容。

為什么要這樣用?

主要原因是為了實現代碼分割,從而提升應用的初始加載性能。通過將每個路由的代碼分割成單獨的文件,用戶訪問應用時只需下載當前頁面的代碼,而不是整個應用的代碼。當用戶導航到其他頁面時,再按需加載對應頁面的代碼。Suspensefallback 提供了一種與代碼分割配合使用的標準方式來顯示加載狀態。

總而言之,這個 AppRouter 組件利用 useRoutes 進行路由匹配,并結合 <Suspense>fallback 屬性為通過 React.lazy() 進行代碼分割的路由組件提供了統一的加載狀態處理。<PageLoading /> 就是在這些異步加載發生時用戶會看到的占位符。

解釋 Suspense 和 fallback:

  • Suspense: 想象它是一個看門人。它看著它內部的孩子們 ({element})。如果任何一個孩子說“等等,我還沒準備好,我正在等一些數據或代碼”,Suspense 就會把這個孩子暫時藏起來,然后展示它的 fallback 屬性指定的內容。一旦孩子說“好了,我準備好了”,Suspense 就會把孩子重新放出來。
  • fallback={<PageLoading />}: 這個屬性告訴 Suspense,當它的子組件 ({element}) 處于“等待”狀態時,應該顯示什么。在這里,我們告訴它顯示我們創建的 <PageLoading /> 組件。這個 <PageLoading /> 就是用戶在等待頁面內容加載時看到的 UI。

這種模式的優點在于:

  1. 性能優化 (代碼分割): 結合 React.lazy,可以實現按需加載代碼,減少初始加載時間和帶寬消耗。
  2. 更好的用戶體驗: 在內容加載期間顯示一個加載提示,而不是一個空白頁面或錯誤,讓用戶知道應用還在工作。
  3. 簡潔的代碼: 不需要手動在組件內部管理加載狀態 (isLoading: true/false),Suspense 幫你處理了。

所以,AppRouter 組件有效地將路由匹配 (useRoutes)、異步加載處理 (Suspense) 和加載狀態顯示 (fallback) 結合在一起,構建了一個健壯且性能友好的應用路由結構。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906101.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言內存函數與數據在內存中的存儲

一、c語言內存函數 1、memcpy函數是一個標準庫函數&#xff0c;用于內存復制。功能上是用來將一塊內存中的內容復制到另一塊內存中。用戶需要提供目標地址、源地址以及要復制的字節數。例如結構體之間的復制。 memcpy函數的原型是&#xff1a;void* memcpy&#xff08;void* …

層次原理圖

層次原理圖簡介 層次原理圖&#xff08;Hierarchical Schematic&#xff09;是一種常用于電子工程與系統設計的可視化工具&#xff0c;通過分層結構將復雜系統分解為多個可管理的子模塊。它如同“設計藍圖”&#xff0c;以樹狀結構呈現整體與局部的關系&#xff1a;頂層展現系…

流程編輯器Bpmn與LogicFlow學習

工作流技術如何與用戶交互結合&#xff08;如動態表單、任務分配&#xff09;處理過 XML 與 JSON 的轉換自定義過 bpmn.js 的樣式&#xff08;如修改節點顏色、形狀、圖標&#xff09;擴展過上下文菜單&#xff08;Palette&#xff09;或屬性面板&#xff08;Properties Panel&…

LWIP的NETCONN接口

NETCONN接口簡介 NETCONN API 使用了操作系統的 IPC 機制&#xff0c; 對網絡連接進行了抽象&#xff0c;使用同一的接口完成UDP和TCP連接 NETCONN API接口是在RAW接口基礎上延申出來的一套API接口 NETCONN實現原理 2.1&#xff0c;NETCONN控制塊 2.2&#xff0c;NETCONN收…

Linux搜索

假如我們要搜索 struct sockaddr_in 我們在命令終端輸入 cd/usr/include/ //進入頭文件目錄地址 /usr/include/ grep " struct sockaddr_in { " *-nir &#xff08;*是在當前目錄&#xff0c;n 是找出來顯示行數…

2025長三角杯數學建模B題思路模型代碼:空氣源熱泵供暖的溫度預測,賽題分析與思路

2025長三角杯數學建模B題思路模型代碼&#xff0c;詳細內容見文末名片 空氣源熱泵是一種與中央空調類似的設備&#xff0c;其結構主要由壓縮主機、熱交換 器以及末端構成&#xff0c;依靠水泵對末端房屋提供熱量來實現制熱。空氣源熱泵作為熱 慣性負載&#xff0c;調節潛力巨…

ssh免密碼登錄

創建秘鑰和公鑰 ssh-keygen -t rsa 輸入上述命令后&#xff0c;直接按回車即可&#xff0c;完成后會在上面信息顯示&#xff0c;生成的文件路徑信息 id_rsa&#xff1a;秘鑰 id_rsa.pub&#xff1a; 公鑰 將公鑰的內容copy到遠端 將id_rsa.pub的內容拷貝到~/.ssh下的authori…

基于Bootstrap 的網頁html css 登錄頁制作成品

目錄 前言 一、網頁制作概述 二、登錄頁面 2.1 HTML內容 2.2 CSS樣式 三、技術說明書 四、頁面效果圖 前言 ?Bootstrap?是一個用于快速開發Web應用程序和網站的前端框架&#xff0c;由Twitter的設計師Mark Otto和Jacob Thornton合作開發。 它基于HTML、CSS和JavaScri…

20倍云臺球機是一種高性能的監控設備

20倍云臺球機是一種高性能的監控設備&#xff0c;其主要特點包括20倍光學變焦能力和云臺旋轉功能。以下是對20倍云臺球機的詳細分析&#xff1a; 一、主要特點 20倍光學變焦 &#xff1a; 攝像機鏡頭能夠在保持圖像清晰度的前提下&#xff0c;將監控目標放大20倍。 這一功能…

大型語言模型應用十大安全風險

40多頁LLM應用的十大風險 這是一份關于LLM應用的十大風險&#xff08;2025版&#xff09;&#xff0c;有一定的參考價值。 如果你時間充裕&#xff0c;可以聽聽播客&#xff0c;詳細了解&#xff1a; 如果你只想快速了解10條分別是什么&#xff0c;可以直接看重點摘錄&#xff…

一文掌握工業相機選型計算

目錄 一、基本概念 1.1 物方和像方 1.2 工作距離和視場 1.3 放大倍率 1.4 相機芯片尺寸 二、公式計算 三、實例應用 一、基本概念 1.1 物方和像方 在光學領域&#xff0c;物方&#xff08;Object Space&#xff09;是與像方&#xff08;Image Space&#xff09;相對的…

《虛擬即真實:數字人驅動技術在React Native社交中的涅槃》

當React Native與數字人驅動技術相遇&#xff0c;它們將如何攜手塑造社交應用中智能客服與虛擬主播的自然交互呢&#xff1f;這正是本文要深入探討的話題。 React Native是Facebook開源的一個用于構建原生移動應用的框架&#xff0c;它允許開發者使用JavaScript和React編寫代碼…

使用AI 生成PPT 最佳實踐方案對比

文章大綱 一、專業AI生成工具(推薦新手)**1. 推薦工具詳解****2. 操作流程優化****3. 優勢與局限**二、代碼生成方案(開發者推薦)**1. Python-pptx進階用法****2. GitHub推薦**三、混合工作流(平衡效率與定制)**1. 工具鏈升級****2. 示例Markdown結構**四、網頁轉換方案(…

前端-HTML元素

目錄 HTML標簽是什么&#xff1f; 什么是HTML元素&#xff1f; HTML元素有哪些分類方法&#xff1f; 什么是HTML頭部元素 更換路徑 注&#xff1a;本文以leetbook為基礎 HTML標簽是什么&#xff1f; HTML標簽是HTML語言中最基本單位和重要組成部分 雖然它不區分大小寫&a…

菱形繼承原理

在C中&#xff0c;菱形繼承的內存模型會因是否使用虛繼承產生本質差異。我們通過具體示例說明兩種場景的區別&#xff1a; 一、普通菱形繼承的內存模型 class A { int a; }; class B : public A { int b; }; class C : public A { int c; }; class D : public B, public C { i…

2025認證杯數學建模第二階段A題小行星軌跡預測思路+模型+代碼

2025認證杯數學建模第二階段思路模型代碼&#xff0c;詳細內容見文末名片 一、問題重述 1.1 問題背景 在浩瀚無垠的宇宙中&#xff0c;近地小行星&#xff08;NEAs&#xff09;宛如一顆顆神秘的“太空子彈”&#xff0c;其軌道相對接近地球&#xff0c;給我們的藍色星球帶來…

掌握Docker Commit:輕松創建自定義鏡像

使用 docker commit 命令可以通過對現有容器進行修改來創建新的鏡像。-a 選項用于指定作者信息&#xff0c;-m 選項用于添加提交信息。以下是具體步驟&#xff1a; 啟動并修改容器 啟動一個容器并進行必要的修改。例如&#xff0c;啟動一個 Ubuntu 容器并安裝一些軟件包&…

Java虛擬機 - JVM與Java體系結構

Java虛擬機 JVM與Java體系結構為什么要學習JVMJava與JVM簡介Java 語言的核心特性JVM&#xff1a;Java 生態的基石JVM的架構模型基于棧的指令集架構&#xff08;Stack-Based&#xff09;基于寄存器的指令集架構&#xff08;Register-Based&#xff09;JVM生命周期 總結 JVM與Jav…

【PostgreSQL系列】PostgreSQL 復制參數詳解

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

阿里巴巴開源移動端多模態LLM工具——MNN

MNN 是一個高效且輕量級的深度學習框架。它支持深度學習模型的推理和訓練&#xff0c;并在設備端的推理和訓練方面具有行業領先的性能。目前&#xff0c;MNN 已集成到阿里巴巴集團的 30 多個應用中&#xff0c;如淘寶、天貓、優酷、釘釘、閑魚等&#xff0c;覆蓋了直播、短視頻…