react路由中Suspense的詳細介紹
好的,我們來詳細解釋一下這個 AppRouter 組件的代碼。
這個組件是一個在現(xiàn)代 React 應(yīng)用中非常常見的模式,特別是在使用 React Router v6+ 進行路由管理和結(jié)合代碼分割(Code Splitting)來優(yōu)化性能時。
const AppRouter = () => {
const element = useRoutes(routes);
return <Suspense fallback={<PageLoading />}>{element}</Suspense>;
};組件功能概述:
AppRouter 組件的核心功能是根據(jù)當(dāng)前的 URL 決定渲染哪個頁面組件,并且在頁面組件(特別是那些通過代碼分割延遲加載的組件)正在加載時顯示一個加載中的提示。
代碼逐行解釋:
const AppRouter = () => { ... };
這定義了一個名為 AppRouter 的函數(shù)式 React 組件。
const element = useRoutes(routes);
useRoutes 是 React Router v6+ 提供的一個 Hook。它接收一個 routes 配置數(shù)組作為參數(shù)。這個 routes 數(shù)組通常包含了你的應(yīng)用中所有路由的定義,比如哪個路徑對應(yīng)哪個組件。例如: JavaScript
const routes = [
{ path: '/', element: <HomePage /> },
{ path: '/about', element: <AboutPage /> }, // 可能是通過 React.lazy 導(dǎo)入的組件
{ path: '*', element: <NotFoundPage /> },
];useRoutes Hook 會讀取當(dāng)前的 URL,然后在 routes 數(shù)組中找到匹配的路由配置。它返回與當(dāng)前 URL 匹配的路由配置中 element 對應(yīng)的 React 元素。換句話說,它會返回應(yīng)該當(dāng)前渲染的頁面組件(或 null,如果沒有匹配到)。所以,element 變量現(xiàn)在 holding 了根據(jù)當(dāng)前 URL 應(yīng)該顯示的頁面組件。
return <Suspense fallback={<PageLoading />}>{element}</Suspense>;
這是組件的返回值,渲染了核心的路由內(nèi)容。
<Suspense>是 React 內(nèi)置的一個組件。它是用于處理異步操作的一種方式,特別常用于代碼分割(Code Splitting)。- 當(dāng)
Suspense的子組件(在這里是{element},也就是當(dāng)前路由匹配到的頁面組件)因為它自身需要的某些資源(例如通過React.lazy延遲加載的代碼塊)還沒有加載完成而**暫停渲染(suspends)**時,Suspense就會捕獲這個暫停。fallback={<PageLoading />}是<Suspense>組件的一個重要屬性。 fallback屬性:它指定了一個在子組件暫停渲染期間需要顯示的備用 UI。<PageLoading />:在這個例子中,fallback的值是一個<PageLoading />React 元素。PageLoading應(yīng)該是一個你自定義的組件,用來顯示加載中的狀態(tài),比如一個旋轉(zhuǎn)的加載圖標、一個進度條或者簡單的文本提示。- 用法:這意味著當(dāng)
element(即當(dāng)前頁面組件)因為代碼正在異步加載而無法立即渲染時,React 會暫時渲染<PageLoading />組件來代替它。一旦element所需的代碼加載完成并可以渲染了,Suspense就會自動切換回渲染element。
Suspense 和 fallback 的作用總結(jié):
- 當(dāng)你使用
React.lazy()來導(dǎo)入一個組件(例如,將每個路由對應(yīng)的頁面組件都進行 lazy 導(dǎo)入),首次訪問這個組件時,React 需要異步加載對應(yīng)的 JavaScript 代碼塊。在代碼塊加載完成之前,React.lazy()返回的組件會觸發(fā)一個“暫停”(suspension)。 <Suspense>組件就是用來捕獲這種暫停的。fallback屬性則定義了在暫停期間顯示什么內(nèi)容。這提供了一種優(yōu)雅的方式來處理加載狀態(tài),而不是手動管理 loading 狀態(tài)變量。
這個 AppRouter 組件的整體工作流程:
用戶訪問應(yīng)用的某個 URL。useRoutes(routes) 根據(jù) URL 找到匹配的路由配置,并返回對應(yīng)的頁面組件(存儲在 element 中)。這個頁面組件很可能是通過 React.lazy() 異步加載的。element 被渲染到 <Suspense> 內(nèi)部。如果 element 是一個通過 React.lazy() 導(dǎo)入的組件,并且其代碼正在加載中,它會觸發(fā)暫停。<Suspense> 捕獲這個暫停,并渲染 fallback 屬性指定的內(nèi)容,即 <PageLoading /> 組件。用戶看到加載提示。當(dāng) element 所需的代碼加載完成后,React 自動重試渲染 element。這次 element 可以正常渲染了,<Suspense> 移除 <PageLoading />,并顯示真實的頁面內(nèi)容。
為什么要這樣用?
- 主要原因是為了實現(xiàn)代碼分割,從而提升應(yīng)用的初始加載性能。通過將每個路由的代碼分割成單獨的文件,用戶訪問應(yīng)用時只需下載當(dāng)前頁面的代碼,而不是整個應(yīng)用的代碼。當(dāng)用戶導(dǎo)航到其他頁面時,再按需加載對應(yīng)頁面的代碼。
Suspense和fallback提供了一種與代碼分割配合使用的標準方式來顯示加載狀態(tài)。
總而言之,這個 AppRouter 組件利用 useRoutes 進行路由匹配,并結(jié)合 <Suspense> 和 fallback 屬性為通過 React.lazy() 進行代碼分割的路由組件提供了統(tǒng)一的加載狀態(tài)處理。<PageLoading /> 就是在這些異步加載發(fā)生時用戶會看到的占位符。
解釋 Suspense 和 fallback:
Suspense: 想象它是一個看門人。它看著它內(nèi)部的孩子們 ({element})。如果任何一個孩子說“等等,我還沒準備好,我正在等一些數(shù)據(jù)或代碼”,Suspense就會把這個孩子暫時藏起來,然后展示它的fallback屬性指定的內(nèi)容。一旦孩子說“好了,我準備好了”,Suspense就會把孩子重新放出來。fallback={<PageLoading />}: 這個屬性告訴Suspense,當(dāng)它的子組件 ({element}) 處于“等待”狀態(tài)時,應(yīng)該顯示什么。在這里,我們告訴它顯示我們創(chuàng)建的<PageLoading />組件。這個<PageLoading />就是用戶在等待頁面內(nèi)容加載時看到的 UI。
這種模式的優(yōu)點在于:
- 性能優(yōu)化 (代碼分割): 結(jié)合
React.lazy,可以實現(xiàn)按需加載代碼,減少初始加載時間和帶寬消耗。 - 更好的用戶體驗: 在內(nèi)容加載期間顯示一個加載提示,而不是一個空白頁面或錯誤,讓用戶知道應(yīng)用還在工作。
- 簡潔的代碼: 不需要手動在組件內(nèi)部管理加載狀態(tài) (
isLoading: true/false),Suspense幫你處理了。
所以,AppRouter 組件有效地將路由匹配 (useRoutes)、異步加載處理 (Suspense) 和加載狀態(tài)顯示 (fallback) 結(jié)合在一起,構(gòu)建了一個健壯且性能友好的應(yīng)用路由結(jié)構(gòu)。
到此這篇關(guān)于react路由中Suspense的介紹的文章就介紹到這了,更多相關(guān)react路由Suspense內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
react 實現(xiàn)圖片正在加載中 加載完成 加載失敗三個階段的原理解析
這篇文章主要介紹了react 實現(xiàn)圖片正在加載中 加載完成 加載失敗三個階段的,通過使用loading的圖片來占位,具體原理解析及實現(xiàn)代碼跟隨小編一起通過本文學(xué)習(xí)吧2021-05-05
React在Dva項目中創(chuàng)建并引用頁面局部組件的方式
這篇文章主要介紹了React在Dva項目中創(chuàng)建并引用頁面局部組件的方式,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-07-07
React Native 集成jpush-react-native的示例代碼
這篇文章主要介紹了React Native 集成jpush-react-native的示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08
React使用Electron開發(fā)桌面端的詳細流程步驟
React是一個流行的JavaScript庫,用于構(gòu)建Web應(yīng)用程序,結(jié)合Electron框架,可以輕松地將React應(yīng)用程序打包為桌面應(yīng)用程序,本文詳細介紹了使用React和Electron開發(fā)桌面應(yīng)用程序的步驟,需要的朋友可以參考下2023-06-06

