creat"> creat"> creat">
React 词条目录
前端Wiki/React/实战/工程化起步

React Router 路由

React 本身不带路由,单页应用的路由由 react-router-dom 实现。Vite 项目推荐数据路由写法:createBrowserRouter(routes) 配置路由表,<RouterProvider router={router} /> 挂载;<Outlet /> 是子路由的"占位"。

核心组件:<Link to="/about"> 做声明式跳转(不刷新页面),useNavigate() 做编程式跳转,useParams() 取动态参数(/user/:id),useSearchParams() 取查询参数(?kw=x)。

  • createBrowserRouter 配路由表 + RouterProvider 挂载(Vite 推荐)
  • Link 声明跳转 / useNavigate 编程跳转 / useParams 取动态参数
  • 是嵌套子路由的渲染占位
Router
// src/main.jsx —— 数据路由写法(react-router-dom v6.4+)
import { createBrowserRouter, RouterProvider } from 'react-router-dom';
import Layout from './Layout';
import Home from './pages/Home';
import User from './pages/User';
import NotFound from './pages/NotFound';

const router = createBrowserRouter([
  {
    path: '/',
    element: <Layout />,          // 布局组件,内部有 <Outlet/>
    children: [                   // 子路由渲染到 Outlet 位置
      { index: true, element: <Home /> },
      { path: 'user/:id', element: <User /> },
      { path: '*', element: <NotFound /> },   // 兜底 404
    ],
  },
]);

createRoot(document.getElementById('root')).render(<RouterProvider router={router} />);

// src/pages/User.jsx —— 取参数与编程式跳转
import { useParams, useNavigate, Link } from 'react-router-dom';
import { useEffect, useState } from 'react';

function User() {
  const { id } = useParams();              // /user/42 -> id='42'
  const navigate = useNavigate();
  const [user, setUser] = useState(null);

  useEffect(() => {
    fetch('/api/users/' + id).then(r => r.json()).then(setUser);
  }, [id]);

  if (!user) return <p>加载中…</p>;
  return (
    <div>
      <h1>{user.name}(#{id})</h1>
      <Link to="/">回首页</Link>
      <button onClick={() => navigate('/user/' + (Number(id) + 1))}>下一位</button>
    </div>
  );
}
本节要点react-router-dom:路由表 + Link/useNavigate 跳转 + useParams 取参 + Outlet 嵌套。