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

