策略
- 使用 React.memo 或 PureComponent:对于开销较大的路由组件,通过
React.memo
(函数组件)或 PureComponent
(类组件)来包裹,仅当组件的 props 发生变化时才重新渲染。
- 路由懒加载:使用 React Router 的动态导入功能,只有在路由需要渲染时才加载对应的组件,减少初始加载时间。
- 合理使用
key
:在路由切换时,通过设置合适的 key
值,让 React 能够正确识别组件的变化,避免不必要的重渲染。
- 页面过渡效果:使用 CSS 动画或 React Transition Group 来实现流畅的页面过渡效果。
React Router 相关 API 和技术要点
React.lazy
和 Suspense
:用于实现路由组件的懒加载。React.lazy
动态导入组件,Suspense
组件在组件加载时显示加载状态。
Routes
和 Route
:Routes
组件用于定义路由集合,Route
组件用于定义单个路由及其对应的组件。
useLocation
:可以获取当前的路由位置,用于在路由变化时执行某些操作,例如控制过渡效果。
代码示例
- 路由懒加载与 React.memo
import React, { lazy, Suspense } from'react';
import { Routes, Route } from'react-router-dom';
// 懒加载组件
const BigComponent = lazy(() => import('./BigComponent'));
const MemoizedBigComponent = React.memo(BigComponent);
function App() {
return (
<Routes>
<Route path="/big" element={
<Suspense fallback={<div>Loading...</div>}>
<MemoizedBigComponent />
</Suspense>
} />
</Routes>
);
}
export default App;
- 页面过渡效果(使用 React Transition Group)
import React from'react';
import { Routes, Route, useLocation } from'react-router-dom';
import { CSSTransition } from'react-transition-group';
import Home from './Home';
import About from './About';
const duration = 300;
function App() {
const location = useLocation();
return (
<Routes location={location} key={location.pathname}>
<Route path="/" element={
<CSSTransition
in={true}
timeout={duration}
classNames="fade"
unmountOnExit
>
<Home />
</CSSTransition>
} />
<Route path="/about" element={
<CSSTransition
in={true}
timeout={duration}
classNames="fade"
unmountOnExit
>
<About />
</CSSTransition>
} />
</Routes>
);
}
export default App;
.fade-enter {
opacity: 0;
}
.fade-enter-active {
opacity: 1;
transition: opacity ${duration}ms ease-in;
}
.fade-exit {
opacity: 1;
}
.fade-exit-active {
opacity: 0;
transition: opacity ${duration}ms ease-out;
}