React 路由

博客的多页面、后台的菜单跳转,在 React 里都靠「路由」完成:URL 变了,页面内容跟着换,但浏览器不刷新页面。react-router-dom 是 React 生态的事实标准路由库。本节以 v6 版本讲清最常用的四招:声明、跳转、取参、兜底。

安装与最小示例

先在项目里安装依赖:

npm install react-router-dom

路由由三件套组成:BrowserRouter 包住整个应用,Routes 声明路由表,Link 负责页面跳转。

import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';
import Home from './pages/Home';
import About from './pages/About';

export default function App() {
  return (
    <BrowserRouter>
      <nav>
        <Link to="/">首页</Link> | <Link to="/about">关于</Link>
      </nav>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </BrowserRouter>
  );
}
// 点击链接只换 URL 与下方内容,整个过程不刷新页面

动态参数 useParams

地址里会变化的部分用 :xxx 占位,组件内部用 useParams 读取。

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

export default function Article() {
  const { id } = useParams(); // 从 URL 取出参数
  return <h1>正在查看文章:{id}</h1>;
}
// 访问 /article/12 时页面显示:正在查看文章:12

路由表中这样声明带参数的路径:

<Route path="/article/:id" element={<Article />} />

编程式跳转 useNavigate

按钮点击、登录成功这类「不是链接」的跳转,不能靠 Link,要用 useNavigate 手动触发。

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

export default function Login() {
  const navigate = useNavigate();

  function handleLogin() {
    // 模拟登录成功,跳回首页
    navigate('/');
    // navigate('/home', { replace: true }) 可替换历史记录
  }

  return <button onClick={handleLogin}>登录并跳转</button>;
}

嵌套路由与 404 兜底

Route 可以嵌套:父路由渲染公共布局,子路由渲染内容区;path="*" 会在任何地址都匹配不上时显示 404 页面。

<Routes>
  <Route path="/" element={<Layout />}>
    <Route index element={<Home />} />        {/* 默认子路由 */}
    <Route path="about" element={<About />} />
  </Route>
  <Route path="*" element={<h1>404 页面不存在</h1>} />
</Routes>

小结

路由本质上是一张「URL 到组件」的映射表:Routes/Route 负责声明,Link 与 useNavigate 负责跳转,useParams 读取动态参数,* 做 404 兜底。记住这四招,任何后台系统的页面框架都能搭出来。

笔记加载中…