React 第三十八节 Router 中useRoutes 的使用详解及注意事项

前言

useRoutes 是 React Router v6 引入的一个钩子函数,允许通过 JavaScript 对象(而非传统的 JSX 语法)定义路由配置。这种方式更适合复杂路由结构,且代码更简洁易维护。

一、基础使用

1.1、useRoutes路由配置对象

useRoutes 接收一个路由配置数组,每个路由对象包含以下属性:

path: 路由路径(支持动态参数,如 /users/:id) element: 对应的 React 组件 children: 嵌套子路由 index: 标记默认子路由(类似 <Navigate to="default-child" />)

javascript 复制代码
const routes = [
  { path: "/", element: <Home /> },
  { path: "/about", element: <About /> },
  {
    path: "/users",
    element: <UsersLayout />,
    children: [
      { index: true, element: <UserList /> }, // 默认子路由
      { path: ":userId", element: <UserProfile /> },
    ],
  },
  { path: "*", element: <NotFound /> }, // 404 页面
];

1.2、在组件中使用 useRoutes

将定义好的路由配置传入 useRoutes,并在组件中渲染它:

javascript 复制代码
import { useRoutes } from 'react-router-dom';

function App() {
  const element = useRoutes(routes);
  return element;
}

二、完整代码案例

2.1、页面组件定义

javascript 复制代码
// Home.jsx
export default function Home() {
  return <h1>Home Page</h1>;
}

// About.jsx
export default function About() {
  return <h1>About Us</h1>;
}

// UsersLayout.jsx
import { Outlet } from 'react-router-dom';
export default function UsersLayout() {
  return (
    <div>
      <h2>Users</h2>
      <Outlet /> {/* 子路由渲染位置 */}
    </div>
  );
}

// UserList.jsx
import { Link } from 'react-router-dom';
export default function UserList() {
  return (
    <div>
      <Link to="1">User 1</Link>
      <Link to="2">User 2</Link>
    </div>
  );
}

// UserProfile.jsx
import { useParams } from 'react-router-dom';
export default function UserProfile() {
  const { userId } = useParams();
  return <h3>User ID: {userId}</h3>;
}

// NotFound.jsx
export default function NotFound() {
  return <h1>404 - Page Not Found</h1>;
}

2.2、useRoutes路由配置与 App 组件

javascript 复制代码
import { useRoutes } from 'react-router-dom';
import Home from './Home';
import About from './About';
import UsersLayout from './UsersLayout';
import UserList from './UserList';
import UserProfile from './UserProfile';
import NotFound from './NotFound';

const routes = [
  { path: '/', element: <Home /> },
  { path: '/about', element: <About /> },
  {
    path: '/users',
    element: <UsersLayout />,
    children: [
      { index: true, element: <UserList /> },
      { path: ':userId', element: <UserProfile /> },
    ],
  },
  { path: '*', element: <NotFound /> },
];

function App() {
  const element = useRoutes(routes);
  return element;
}

export default App;

2.3、入口文件(启用路由useRoutes)

javascript 复制代码
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import App from './App';

ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>,
  document.getElementById('root')
);

三、关键点说明

3.1、useRoutes动态路由参数

使用 :paramName 定义动态路径(如 /users/:userId)。 在组件中通过 useParams() 获取参数值。 useParam是使用详解

3.2、useRoutes嵌套路由

父路由通过 指定子路由的渲染位置。 子路由路径会自动继承父路径(如 /users/1 匹配父路径 /users 的子路由 :userId)。

3.3、导航

使用 <Link to="path"> 进行页面跳转,而非 <a> 标签。 示例:在 UserList 组件中跳转到用户详情页。

四、扩展场景

4.1、useRoutes 懒加载组件

结合 React.lazy 和 Suspense 实现按需加载:

javascript 复制代码
const Home = React.lazy(() => import('./Home'));
const routes = [
  { 
    path: '/', 
    element: (
      <Suspense fallback={<div>Loading...</div>}>
        <Home />
      </Suspense>
    ) 
  },
];

4.2、useRoutes 路由守卫

在路由配置的 element 中加入权限校验逻辑:

javascript 复制代码
const PrivateRoute = ({ children }) => {
  const isAuthenticated = checkAuth();
  return isAuthenticated ? children : <Navigate to="/login" />;
};

const routes = [
  { 
    path: '/dashboard', 
    element: <PrivateRoute><Dashboard /></PrivateRoute> 
  },
];

我们可以用更清晰的 JavaScript 对象管理路由,灵活处理动态参数、嵌套布局和复杂逻辑。

相关推荐
FungLeo27 分钟前
成为全栈·React 管理后台篇·总复盘:从“接口能调通”到“后台值得使用”
前端·react.js·前端框架·项目复盘·成为全栈
Csvn2 小时前
并发模式:让渲染学会排队、插队和让路
前端
可乐鸡翅yeah_2 小时前
新手梳理:M3U8 线上问题,哪些是前端锅,哪些是后端锅
前端·ios·音视频·实时音视频·m3u8·音视频在线播放
Flynt2 小时前
Linear 用 1000 个 PR 换掉 styled-components,我写了 200 个按钮,把这笔账复现了一遍
前端·css·preact
JavaGuide3 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel3 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
莪_幻尘5 小时前
Skill 体检:30 个 Skill 全凭感觉?体检器先自曝了 8 个“假 0 分
前端·人工智能·llm
风骏时光牛马5 小时前
AI模型综合能力评测:性能、指令遵循与多场景实测对比
前端
Frag0ut5 小时前
Chrome与Chromium内核浏览器在Windows 11上的新特性全景解析
前端·chrome·windows·web安全·chromium·gemini ai·playready drm
hiahiahia1235 小时前
实现完整 Tool Dispatcher
开发语言·前端