📌React 路由超详解(2025 版):从 0 到 1 再到 100,一篇彻底吃透

本文基于 React Router 6.23 ,覆盖 基础 → 进阶 → 性能 → 微前端,附代码,复制即用。


📌 目录

  1. 路由基础:4 种 Router 与 4 个核心 API
  2. 参数与状态:useParams、useSearchParams、useLocation
  3. 路由守卫与重定向:高阶组件、Outlet、Navigate
  4. 懒加载 & Suspense:首屏优化实战
  5. 路由性能:嵌套、缓存、防抖
  6. 微前端路由:qiankun / single-spa 配置

1️⃣ 路由基础:4 种 Router 与 4 个核心 API

Router 场景 示例
BrowserRouter 大多数项目 https://app.com/user/1
HashRouter 老服务器无配置 https://app.com/#/user/1
MemoryRouter 单元测试 内存路由
StaticRouter SSR Node 端渲染

最小可运行示例(Vite + React Router 6)

tsx 复制代码
// main.tsx
import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom';
import App from './App';

ReactDOM.createRoot(document.getElementById('root')!).render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
);
tsx 复制代码
// App.tsx
import { Routes, Route } from 'react-router-dom';
import Home from './pages/Home';
import User from './pages/User';

export default function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/user/:id" element={<User />} />
    </Routes>
  );
}

2️⃣ 参数与状态:3 个 Hook 全覆盖

Hook 作用 示例
useParams 路由参数 const { id } = useParams()
useSearchParams 查询字符串 const [search, setSearch] = useSearchParams()
useLocation 完整 URL 状态 const { pathname, search } = useLocation()

动态路由 + 查询参数

tsx 复制代码
// /user/123?tab=profile
function User() {
  const { id } = useParams();            // 123
  const [search] = useSearchParams();    // tab=profile
  const tab = search.get('tab') || 'info';
  return <div>用户 {id} - {tab}</div>;
}

3️⃣ 路由守卫与重定向

① 高阶组件守卫

tsx 复制代码
import { Navigate, Outlet } from 'react-router-dom';

function RequireAuth() {
  const isLogin = useAuth();
  return isLogin ? <Outlet /> : <Navigate to="/login" replace />;
}

<Route element={<RequireAuth />}>
  <Route path="/dashboard" element={<Dashboard />} />
</Route>

② 404 重定向

tsx 复制代码
<Route path="*" element={<NotFound />} />

4️⃣ 懒加载 & Suspense:首屏瘦身

tsx 复制代码
import { lazy, Suspense } from 'react';

const LazyPage = lazy(() => import('./pages/LazyPage'));

<Route
  path="/lazy"
  element={
    <Suspense fallback={<Skeleton />}>
      <LazyPage />
    </Suspense>
  }
/>

配合 SplitChunks ,首屏 JS 体积 -70%


5️⃣ 性能优化 3 连击

问题 解决 代码
深层嵌套重渲染 React.memo + Outlet const MemoRoute = React.memo(Route)
相同路由重复渲染 key 参数 <Route key={location.key} ... />
滚动位置丢失 useLocation + useEffect 见下方示例
tsx 复制代码
// 保存滚动位置
const location = useLocation();
useEffect(() => {
  window.scrollTo(0, 0);
}, [location.pathname]);

6️⃣ 微前端路由(qiankun)

主应用路由映射

tsx 复制代码
// 主应用
import { registerMicroApps, start } from 'qiankun';

registerMicroApps([
  {
    name: 'sub-vue',
    entry: '//localhost:3001',
    container: '#sub-vue',
    activeRule: '/sub-vue',
  },
]);
start();

子应用路由(独立)

tsx 复制代码
// 子应用
import { createRouter, createWebHistory } from 'vue-router';

const router = createRouter({
  history: createWebHistory('/sub-vue'),
  routes: [...],
});

7️⃣ 速记 30 秒模板

"React Router 6 用 Routes/Route 声明式路由,useNavigate 跳转;权限用高阶组件或 RequireAuth;懒加载用 Suspense;微前端用 qiankun 路由隔离;性能用 React.memo + Outlet。"


附:脑图速记

yaml 复制代码
React Router 6
├─ Router: Browser/Hash/Memory/Static
├─ Route: path + element
├─ Hook: useParams / useSearchParams / useNavigate
├─ Guard: RequireAuth / Navigate
├─ Lazy: Suspense + defineAsyncComponent
└─ 性能: React.memo / key / scroll restore
相关推荐
专注VB编程开发20年6 分钟前
rust语言-对象多级访问
服务器·前端·rust
徐_三岁16 分钟前
关于npm的钩子函数
前端·npm·node.js
代码小学僧17 分钟前
🎉 在 Tailwind 中愉快的使用 Antd Design 色彩
前端·css·react.js
ssshooter21 分钟前
复习 CSS Flex 和 Grid 布局
前端·css·html
_请输入用户名1 小时前
EventEmitter 是广播,Tapable 是流水线:聊聊它们的本质区别
前端·设计模式
爱学习的茄子1 小时前
React Fiber:让大型应用告别卡顿的性能革命
前端·react.js·面试
龙在天1 小时前
我是前端,我来总结一下前端 配 Nginx 的一些案例
前端
Thetimezipsby1 小时前
基于Taro4打造的一款最新版微信小程序、H5的多端开发简单模板
前端·javascript·微信小程序·typescript·html5·taro
掘金安东尼1 小时前
前端周刊430期(2025年9月1日–9月7日)
前端
BUG创建者1 小时前
uni 拍照上传拍视频上传以及相册
前端·javascript·音视频