📌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
相关推荐
weixin_382395231 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__1 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.2 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~3 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华3 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子6 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅6 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni6 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学7 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端