React利用lazy+Suspense實現(xiàn)路由懶加載
文檔
進入頁面后,組件的內(nèi)容會通過 http 請求到對應的組件文件,當路由中有較多的頁面時,會出現(xiàn)一個問題,那就是一次性將所有的組件都加載了,浪費性能,所以可以通過懶加載的形式來處理。
src/router/routes.ts,使用 react 的 lazy 進行按需引入:
import { lazy, LazyExoticComponent } from 'react' export interface RouteType { path: string component: LazyExoticComponent<any> title?: string exact?: boolean } const routes: RouteType[] = [ { path: '/', component: lazy(() => import('@/views/home/HomePage')) }, { path: '/demo/index', component: lazy(() => import('@/views/demo/DemoIndex')) }, { path: '/demo/popup', component: lazy(() => import('@/views/demo/DemoPopup')) } ] export default routes
react 的 lazy 按需引入必須搭配 Suspense 才能實現(xiàn)懶加載過程,在 src/router/components/AppRouter.tsx 中引入創(chuàng)建的路由表:
import React, { Suspense } from 'react' import { Router, Route, Switch } from 'react-router-dom' import { createBrowserHistory, History } from 'history' import RouteLoading from './RouteLoading' import routes, { RouteType } from '../routes' import { BASE_PATH } from '@/globalConstants' const history: History = createBrowserHistory() const AppRouter = () => { const AppRoutes = routes.map((route: RouteType) => <Route exact={route.exact === false ? false : true} path={`${BASE_PATH}${route.path}`} render={(props: any) => <route.component {...props} />} key={route.path} /> ) return ( <Router history={history}> <Suspense fallback={<RouteLoading />}> <Switch>{AppRoutes}</Switch> </Suspense> </Router> ) } export default AppRouter
src/router/components/RouteLoading.js :
import React from 'react' import { UuiLoading } from 'uui-web-react' export default function() { return <UuiLoading /> }
Suspense 的 fallback 屬性可以是一個組件,該組件的引入不需要使用 lazy(),直接引入即可。
src/router/index.tsx :
export { default as AppRouter } from './components/AppRouter' export { default as routes } from './routes'
其中,引用到了 globalConstants.ts 中定義的路由常量 BASE_PATH ,src/globalConstants.ts:
// 獨立運行的路由要與配置文件保持一致 export const PUBLIC_PATH = '/uui-utils' export const BASE_PATH = PUBLIC_PATH
App.tsx :
import React from 'react' import { AppRouter } from './router' const App = () => { return <AppRouter /> } export default App
總結(jié):
Lazy 和 Suspense 都是 react 暴露的 api,在使用時需要注意:
Lazy 是個高階函數(shù),接收一個函數(shù)形參,最終返回一個組件, 形參中函數(shù)固定格式:
() => { return import('../../pages/Home/index')};
可以簡寫為:
const Home = lazy(() => import('../../pages/Home/index'))
使用 lazy 進行路由懶加載后,每次點擊 Link 后,再去請求相關(guān)的組件,那這個請求是會耗時間的。在網(wǎng)速比較慢的情況下,會出現(xiàn)路由視圖白屏的情況,所以使用 Suspense 標簽包裹注冊的路由來進行白屏時的頁面展示。
Suspense 標簽接收一個屬性 fallback,fallback 指定一個組件或者 jsx 代碼塊,來展示當請求對應組件,界面白屏時所展示的內(nèi)容。
到此這篇關(guān)于React利用lazy+Suspense實現(xiàn)路由懶加載的文章就介紹到這了,更多相關(guān)React路由懶加載內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
React 組件的狀態(tài)下移和內(nèi)容提升的操作方法
這篇文章主要介紹了React 組件的狀態(tài)下移和內(nèi)容提升,通過代碼講解了渲染性能的組件問題結(jié)合實例代碼給大家講解的非常詳細,需要的朋友可以參考下2022-11-11詳解如何用webpack4從零開始構(gòu)建react開發(fā)環(huán)境
這篇文章主要介紹了詳解如何用webpack4從零開始構(gòu)建react開發(fā)環(huán)境,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-01-01在React中實現(xiàn)分塊導出大量數(shù)據(jù)表格并壓縮成圖片的解決方案
在現(xiàn)代Web開發(fā)中,處理和展示大量數(shù)據(jù)是一個常見的挑戰(zhàn),特別是在使用React框架時,我們經(jīng)常需要將這些數(shù)據(jù)以表格的形式展示,并提供導出功能,本文將介紹如何在React中實現(xiàn)一個高效、分塊導出大量數(shù)據(jù)表格,并將其壓縮為圖片的解決方案,需要的朋友可以參考下2024-12-12淺談React Native 傳參的幾種方式(小結(jié))
這篇文章主要介紹了淺談React Native 傳參的幾種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-05-05