React Router 深入指南:从入门到进阶

前言

随着单页面应用(SPA)的普及,前端路由成为开发中不可或缺的一部分,而 React Router 作为 React 官方推荐的路由库,提供了强大的功能和灵活性。本文将从基础到进阶,带你全面掌握 React Router。

一、初识 React Router

1. 安装 React Router

在项目中安装 React Router DOM:

复制代码
npm install react-router-dom

2. 创建路由结构

React Router 提供多种路由创建方式,其中推荐使用 createBrowserRouter 创建基于浏览器的路由。

复制代码
// src/router/index.jsx
import { createBrowserRouter } from "react-router-dom";
import Home from "../views/Home";
import Login from "../views/Login";

const router = createBrowserRouter([
  {
    path: '/',
    element: <Home />,
  },
  {
    path: '/login',
    element: <Login />,
  }
]);

export default router;

3. 路由挂载

使用 RouterProvider 挂载路由:

复制代码
// src/App.jsx
import { RouterProvider } from "react-router-dom";
import router from "./router";
import Header from "./components/Header";
import Footer from "./components/Footer";

function App() {
  return (
    <div className="app">
      <Header />
      <RouterProvider router={router} />
      <Footer />
    </div>
  );
}

export default App;

4. 嵌套路由

在父路由组件中使用 <Outlet /> 渲染子路由:

复制代码
// src/views/Home.jsx
import { Outlet } from "react-router-dom";

export default function Home() {
  return (
    <div>
      <h1>Home</h1>
      <Outlet />
    </div>
  );
}

在路由配置中定义子路由:

复制代码
// src/router/index.jsx
{
  path: '/home',
  element: <Home />,
  children: [
    {
      path: 'dashboard',
      element: <Dashboard />,
    },
  ],
}

5. 配置 404 页面

为未匹配的路由配置错误页面:

复制代码
// src/views/ErrorPage.jsx
export default function ErrorPage() {
  return <h1>Page Not Found</h1>;
}

在路由配置中使用通配符 *

复制代码
{
  path: '*',
  element: <ErrorPage />,
}

二、路由跳转

复制代码
<Link to="/dashboard">Go to Dashboard</Link>

<NavLink /> 会为匹配的路由自动添加 active 类名:

复制代码
<NavLink to="/dashboard" activeClassName="active">Dashboard</NavLink>

自定义类名或样式:

复制代码
<NavLink to="/dashboard" className={({ isActive }) => isActive ? 'custom-active' : ''}>Dashboard</NavLink>

3. 编程式跳转

使用 useNavigate

复制代码
import { useNavigate } from "react-router-dom";

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

  const handleLogin = () => {
    navigate('/home');
  };

  return <button onClick={handleLogin}>Login</button>;
}

三、传递参数

1. 使用 searchParams(Query 参数)

设置参数:

复制代码
navigate('/login?user=admin&role=admin');

获取参数:

复制代码
import { useSearchParams } from "react-router-dom";

function Login() {
  const [searchParams] = useSearchParams();
  const user = searchParams.get('user');
  const role = searchParams.get('role');

  return <div>User: {user}, Role: {role}</div>;
}

2. 使用 params(路径参数)

设置路径参数:

复制代码
{
  path: '/profile/:id',
  element: <Profile />,
}

获取参数:

复制代码
import { useParams } from "react-router-dom";

function Profile() {
  const { id } = useParams();

  return <div>Profile ID: {id}</div>;
}

四、进阶功能

1. 数据预加载(Loader)

在路由配置中使用 loader

复制代码
{
  path: '/data',
  element: <DataPage />,
  loader: async () => {
    const response = await fetch('/api/data');
    return response.json();
  },
}

在组件中使用 useLoaderData

复制代码
import { useLoaderData } from "react-router-dom";

function DataPage() {
  const data = useLoaderData();

  return <div>{JSON.stringify(data)}</div>;
}

2. 懒加载(Lazy Loading)

使用 React.lazySuspense 实现组件的按需加载:

复制代码
import React, { lazy, Suspense } from "react";

const LazyComponent = lazy(() => import("../views/LazyComponent"));

{
  path: '/lazy',
  element: (
    <Suspense fallback={<div>Loading...</div>}>
      <LazyComponent />
    </Suspense>
  ),
}

五、总结

通过本文,我们系统地梳理了 React Router 的基本用法和进阶功能。无论是创建路由、路由跳转还是参数传递,React Router 都提供了丰富且易用的 API。在实际项目中,合理配置路由和组件加载策略,可以显著提升应用的性能与用户体验。

相关推荐
一 乐9 小时前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
C_心欲无痕9 小时前
ts - tsconfig.json配置讲解
linux·前端·ubuntu·typescript·json
清沫9 小时前
Claude Skills:Agent 能力扩展的新范式
前端·ai编程
yinuo10 小时前
前端跨页面通信终极指南:方案拆解、对比分析
前端
yinuo10 小时前
前端跨页面通讯终极指南⑨:IndexedDB 用法全解析
前端
xkxnq11 小时前
第二阶段:Vue 组件化开发(第 16天)
前端·javascript·vue.js
烛阴11 小时前
拒绝配置地狱!5 分钟搭建 Three.js + Parcel 完美开发环境
前端·webgl·three.js
xkxnq11 小时前
第一阶段:Vue 基础入门(第 15天)
前端·javascript·vue.js
anyup13 小时前
2026第一站:分享我在高德大赛现场学到的技术、产品与心得
前端·架构·harmonyos
BBBBBAAAAAi13 小时前
Claude Code安装记录
开发语言·前端·javascript