📌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
相关推荐
AI_567821 分钟前
Webpack性能优化终极指南:4步实现闪电打包
前端·webpack·性能优化
xuehuayu.cn39 分钟前
js es6 class 类中的值是异步赋值, 子类中如何获取这个值?
javascript·es6
威风的虫43 分钟前
ES6 数组方法:告别循环,拥抱函数式编程
开发语言·前端·javascript
小杨快跑~1 小时前
ES6 Promise:告别回调地狱的异步编程革命
前端·javascript·ecmascript·es6
linweidong1 小时前
VIVO前端面试题及参考答案
前端·跨域·localstorage·重绘·浏览器兼容·git管理·前端重构
有意义1 小时前
从零搭建:json-server+Bootstrap+OpenAI 全栈 AI 小项目
前端·后端·llm
温宇飞1 小时前
CCState:为大型 Web 应用设计的状态管理库
前端
r0ad1 小时前
读诗的时候我却使用了自己研发的Chrome元素截图插件
前端·javascript·chrome
IT_陈寒2 小时前
React性能优化实战:这5个Hooks技巧让我的应用快了40%
前端·人工智能·后端
江天澄2 小时前
HTML5 中常用的语义化标签及其简要说明
前端·html·html5