MST

星途 面试题库

面试题:React Router在复杂场景下的优化与实践

在一个大型React项目中使用React Router,存在多个嵌套路由,部分路由组件渲染开销较大。现在要对路由切换时的性能进行优化,减少不必要的重渲染,同时确保在不同路由间切换时页面过渡效果流畅。请阐述你会采取哪些策略,以及涉及到的React Router相关API和技术要点,并结合代码示例说明。
10.8万 热度难度
前端开发React

知识考点

AI 面试

面试题答案

一键面试

策略

  1. 使用 React.memo 或 PureComponent:对于开销较大的路由组件,通过 React.memo(函数组件)或 PureComponent(类组件)来包裹,仅当组件的 props 发生变化时才重新渲染。
  2. 路由懒加载:使用 React Router 的动态导入功能,只有在路由需要渲染时才加载对应的组件,减少初始加载时间。
  3. 合理使用 key:在路由切换时,通过设置合适的 key 值,让 React 能够正确识别组件的变化,避免不必要的重渲染。
  4. 页面过渡效果:使用 CSS 动画或 React Transition Group 来实现流畅的页面过渡效果。

React Router 相关 API 和技术要点

  1. React.lazySuspense:用于实现路由组件的懒加载。React.lazy 动态导入组件,Suspense 组件在组件加载时显示加载状态。
  2. RoutesRouteRoutes 组件用于定义路由集合,Route 组件用于定义单个路由及其对应的组件。
  3. useLocation:可以获取当前的路由位置,用于在路由变化时执行某些操作,例如控制过渡效果。

代码示例

  1. 路由懒加载与 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;
  1. 页面过渡效果(使用 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;
}