reactjs 如何用React Router解决重载路由换页速度慢的问题?

3gtaxfhh  于 2023-02-18  发布在  React
关注(0)|答案(1)|浏览(313)

我有一个React项目,使用React Router DOM v6来管理我所有的路由。
我有一个路由使用了一个相当重的组件,当切换到那个重组件时,在当前页面消失和新页面出现之前会有1+秒的延迟,因为呈现那个组件需要时间。
有没有一种方法可以在尝试加载组件之前更改页面,或者在加载组件时显示一个“正在加载”的页面?
demo simulating the issue
所谓“重路由”,我的意思是,它渲染缓慢,每当你改变路线。

von4xj4u

von4xj4u1#

您可以实现React.lazy()来延迟加载页面,然后使用React.Suspense()在转换时显示正在加载的页面。

import React, { Suspense } from 'react';

// import MyPage from './pages/MyPage'
// instead of importing MyPage like above, use lazy, like below
const MyPage = React.lazy(() => import('./pages/MyPage'));

function App() {
    return (
        <Suspense
             fallback={<div><p>Loading...</p></div>}
        >
            <Routes>
                <Route path='/mypath' element={<MyPage} />
                // other route data                        
            </Routes>
        </Suspense>                
    )
}

export default App;

这是一个非常简单的例子。它的作用是当你最初加载页面时,MyPage不会被加载。页面的加载将被延迟到需要它的时候。一旦你转到/mypathMyPage就会被加载,并且Suspense组件将显示加载<p>标签。当然,这可以是你想要的任何元素,甚至是一个组件。
或者,在大组件内部,可以使用useState()创建一个简单的布尔isLoadingsetIsLoading状态,并在初始时将其设置为true,然后,如果isLoadingtrue,则呈现一个正在加载的组件,操作完成后,将isLoading设置为false

相关问题