技术文档中心
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
首页
React
Vue
TypeScript
Kotlin
React Native
Electron
Android
  • 入门基础

    • React 学习指南
    • React 快速入门
    • 状态管理基础
    • Hooks 基础
    • 组件通信
    • 生命周期与副作用
    • 实战项目
  • 进阶提升

    • Hooks 进阶
    • 组件设计模式
    • 性能优化
    • React Router
    • 表单处理
    • HTTP 请求
  • 状态管理

    • Context API
    • Redux 状态管理
    • Zustand 轻量状态管理
  • 高级主题

    • React + TypeScript
    • React 测试
    • 服务端渲染 (SSR)
    • 微前端架构

React Router

安装

yarn add react-router-dom

基础使用

配置路由

import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <nav>
        <Link to="/">首页</Link>
        <Link to="/about">关于</Link>
        <Link to="/users">用户</Link>
      </nav>

      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/users" element={<Users />} />
      </Routes>
    </BrowserRouter>
  );
}

动态路由

import { useParams } from 'react-router-dom';

function App() {
  return (
    <Routes>
      <Route path="/user/:id" element={<UserDetail />} />
      <Route path="/post/:postId/comment/:commentId" element={<Comment />} />
    </Routes>
  );
}

function UserDetail() {
  const { id } = useParams();
  return <div>用户ID: {id}</div>;
}

嵌套路由

function App() {
  return (
    <Routes>
      <Route path="/" element={<Layout />}>
        <Route index element={<Home />} />
        <Route path="about" element={<About />} />
        <Route path="users" element={<Users />}>
          <Route path=":id" element={<UserDetail />} />
        </Route>
      </Route>
    </Routes>
  );
}

function Layout() {
  return (
    <div>
      <nav>导航栏</nav>
      <Outlet /> {/* 子路由渲染位置 */}
      <footer>页脚</footer>
    </div>
  );
}

导航

Link 组件

import { Link } from 'react-router-dom';

<Link to="/about">关于</Link>
<Link to="/user/123">用户详情</Link>
<Link to="/search?q=react">搜索</Link>

NavLink 组件

import { NavLink } from 'react-router-dom';

<NavLink 
  to="/about"
  className={({ isActive }) => isActive ? 'active' : ''}
>
  关于
</NavLink>

<NavLink
  to="/users"
  style={({ isActive }) => ({
    color: isActive ? 'red' : 'black'
  })}
>
  用户
</NavLink>

编程式导航

import { useNavigate } from 'react-router-dom';

function LoginForm() {
  const navigate = useNavigate();

  const handleSubmit = () => {
    // 登录成功后跳转
    navigate('/dashboard');
    
    // 替换当前历史记录
    navigate('/home', { replace: true });
    
    // 返回上一页
    navigate(-1);
    
    // 前进
    navigate(1);
  };

  return <button onClick={handleSubmit}>登录</button>;
}

Hooks

useParams

import { useParams } from 'react-router-dom';

function UserDetail() {
  const { id } = useParams();
  return <div>用户ID: {id}</div>;
}

useSearchParams

import { useSearchParams } from 'react-router-dom';

function SearchPage() {
  const [searchParams, setSearchParams] = useSearchParams();
  
  const query = searchParams.get('q');
  const page = searchParams.get('page') || 1;

  const handleSearch = (keyword) => {
    setSearchParams({ q: keyword, page: 1 });
  };

  return (
    <div>
      <p>搜索: {query}</p>
      <p>页码: {page}</p>
    </div>
  );
}

useLocation

import { useLocation } from 'react-router-dom';

function CurrentPath() {
  const location = useLocation();
  
  return (
    <div>
      <p>路径: {location.pathname}</p>
      <p>查询: {location.search}</p>
      <p>哈希: {location.hash}</p>
      <p>状态: {JSON.stringify(location.state)}</p>
    </div>
  );
}

// 传递状态
<Link to="/detail" state={{ from: 'home' }}>详情</Link>

useNavigate

import { useNavigate } from 'react-router-dom';

function BackButton() {
  const navigate = useNavigate();
  
  return (
    <button onClick={() => navigate(-1)}>返回</button>
  );
}

路由守卫

权限路由

import { Navigate } from 'react-router-dom';

function PrivateRoute({ children }) {
  const isAuthenticated = useAuth();
  
  return isAuthenticated ? children : <Navigate to="/login" />;
}

function App() {
  return (
    <Routes>
      <Route path="/login" element={<Login />} />
      <Route 
        path="/dashboard" 
        element={
          <PrivateRoute>
            <Dashboard />
          </PrivateRoute>
        } 
      />
    </Routes>
  );
}

路由拦截

function RequireAuth({ children }) {
  const auth = useAuth();
  const location = useLocation();

  if (!auth.user) {
    return <Navigate to="/login" state={{ from: location }} replace />;
  }

  return children;
}

懒加载

import { lazy, Suspense } from 'react';

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

function App() {
  return (
    <Suspense fallback={<div>加载中...</div>}>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </Suspense>
  );
}

404 页面

function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
      <Route path="*" element={<NotFound />} />
    </Routes>
  );
}

function NotFound() {
  return (
    <div>
      <h1>404 - 页面未找到</h1>
      <Link to="/">返回首页</Link>
    </div>
  );
}

路由模式

BrowserRouter

// 使用 HTML5 History API
// URL: /about
<BrowserRouter>
  <App />
</BrowserRouter>

HashRouter

// 使用 URL hash
// URL: /#/about
<HashRouter>
  <App />
</HashRouter>

MemoryRouter

// 内存路由,用于测试
<MemoryRouter initialEntries={['/home']}>
  <App />
</MemoryRouter>

实战示例

完整应用

import { BrowserRouter, Routes, Route, Link, Navigate } from 'react-router-dom';
import { lazy, Suspense } from 'react';

const Home = lazy(() => import('./pages/Home'));
const About = lazy(() => import('./pages/About'));
const Users = lazy(() => import('./pages/Users'));
const UserDetail = lazy(() => import('./pages/UserDetail'));

function App() {
  return (
    <BrowserRouter>
      <nav>
        <Link to="/">首页</Link>
        <Link to="/about">关于</Link>
        <Link to="/users">用户</Link>
      </nav>

      <Suspense fallback={<div>加载中...</div>}>
        <Routes>
          <Route path="/" element={<Home />} />
          <Route path="/about" element={<About />} />
          <Route path="/users" element={<Users />} />
          <Route path="/users/:id" element={<UserDetail />} />
          <Route path="/old-path" element={<Navigate to="/new-path" replace />} />
          <Route path="*" element={<NotFound />} />
        </Routes>
      </Suspense>
    </BrowserRouter>
  );
}

面包屑导航

import { useLocation, Link } from 'react-router-dom';

function Breadcrumb() {
  const location = useLocation();
  const paths = location.pathname.split('/').filter(x => x);

  return (
    <nav>
      <Link to="/">首页</Link>
      {paths.map((path, index) => {
        const url = `/${paths.slice(0, index + 1).join('/')}`;
        return (
          <span key={url}>
            {' / '}
            <Link to={url}>{path}</Link>
          </span>
        );
      })}
    </nav>
  );
}

最佳实践

  1. 路由配置集中管理
  2. 使用懒加载优化性能
  3. 合理使用嵌套路由
  4. 统一处理404页面
  5. 路由守卫保护敏感页面
  6. 使用 NavLink 高亮当前路由
最近更新: 2026/2/6 15:39
Contributors: hailong
Prev
性能优化
Next
表单处理