当前位置: 首页 > news >正文

React Router v5 vs v6 路由配置对比

React Router v5 vs v6 路由配置对比

React Router 是 React 中最常用的路由库,从 v5 到 v6 版本,发生了较大变化。本文对比 React Router v5React Router v6 的配置方式,帮助开发者顺利迁移。

1. 安装依赖

React Router v5

npm install react-router-dom@5

React Router v6

npm install react-router-dom@latest

2. 基本路由配置

v5 版本 (使用 Switchcomponent)

import { BrowserRouter as Router, Route, Switch } from "react-router-dom";
import Home from "./Home";
import About from "./About";

function App() {
  return (
    <Router>
      <Switch>
        <Route exact path="/" component={Home} />
        <Route path="/about" component={About} />
      </Switch>
    </Router>
  );
}

export default App;

v6 版本 (使用 Routeselement)

import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import Home from "./Home";
import About from "./About";

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

export default App;

主要区别:

  • Switch 在 v6 中被 Routes 取代。
  • Route 不再使用 component={},而是改为 element={<Component />}
  • exact 默认生效,v6 无需手动添加。

3. 动态路由

v5 版本 (match.params)

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

function User() {
  const { id } = useParams();
  return <h1>User ID: {id}</h1>;
}

function App() {
  return (
    <Router>
      <Switch>
        <Route path="/user/:id" component={User} />
      </Switch>
    </Router>
  );
}

v6 版本 (useParams)

function User() {
  const { id } = useParams();
  return <h1>User ID: {id}</h1>;
}

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/user/:id" element={<User />} />
      </Routes>
    </Router>
  );
}

区别: v6 直接在 element 里传入组件,不使用 component={}


4. 路由重定向

v5 版本 (Redirect)

import { Redirect } from "react-router-dom";

function App() {
  return (
    <Router>
      <Switch>
        <Route exact path="/">
          <Redirect to="/home" />
        </Route>
        <Route path="/home" component={Home} />
      </Switch>
    </Router>
  );
}

v6 版本 (Navigate)

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

function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Navigate to="/home" />} />
        <Route path="/home" element={<Home />} />
      </Routes>
    </Router>
  );
}

区别: Redirect 在 v6 中被 Navigate 取代,且必须放在 element 里。


5. 路由守卫

v5 版本 (使用 render)

function PrivateRoute({ component: Component, ...rest }) {
  const isAuthenticated = false; // 示例
  return (
    <Route
      {...rest}
      render={(props) =>
        isAuthenticated ? <Component {...props} /> : <Redirect to="/login" />
      }
    />
  );
}

v6 版本 (使用 Navigate)

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

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

区别:

  • v5 使用 render 方法返回不同组件。
  • v6 直接用 Navigate 进行跳转。

6. 嵌套路由

v5 版本 (match.url)

function Dashboard({ match }) {
  return (
    <div>
      <h1>Dashboard</h1>
      <Link to={`${match.url}/settings`}>Settings</Link>
      <Switch>
        <Route path={`${match.path}/settings`} component={Settings} />
      </Switch>
    </div>
  );
}

v6 版本 (Outlet)

import { Outlet, Link } from "react-router-dom";

function Dashboard() {
  return (
    <div>
      <h1>Dashboard</h1>
      <Link to="settings">Settings</Link>
      <Outlet />
    </div>
  );
}

function App() {
  return (
    <Router>
      <Routes>
        <Route path="dashboard" element={<Dashboard />}>
          <Route path="settings" element={<Settings />} />
        </Route>
      </Routes>
    </Router>
  );
}

区别:

  • v6 使用 Outlet 代替 match.url 进行嵌套路由。

结论

功能v5v6
路由配置Switch + RouteRoutes + Route
动态路由match.paramsuseParams
重定向RedirectNavigate
路由守卫renderNavigate + 组件包裹
嵌套路由match.urlOutlet

如果你是新项目,建议直接使用 React Router v6,如果是老项目,可以按需升级。

相关文章:

  • Vue 中 nextTick 的原理详解
  • DeepSeek掘金——快速集成DeepSeek满血版 搭建智能运维助手
  • 黑马点评自学03
  • Spring MVC 对象转换器:初级开发者入门指南
  • 图书管理系统
  • C++ 设计模式-访问者模式
  • python中的异常-模块-包
  • 基于Spring Boot的农事管理系统设计与实现(LW+源码+讲解)
  • Vue 和 React 响应式的区别
  • 波兰发布世界首个双足肌肉骨骼机器人,细节高度模拟人类生物特征
  • 远离手机APP——数字排毒,回归生活本真
  • 边缘安全加速(ESA)套餐
  • 图解MySQL【日志】——Binlog
  • Web Scraper,强大的浏览器爬虫插件!
  • 前端开发的适配方案
  • grafana 忘记登陆密码
  • 【学习】验证数独的正确性
  • 从零开始玩转TensorFlow:小明的机器学习故事 2
  • [C++ ]使用std::string作为函数参数时的注意事项
  • 【Java 优选算法】位运算
  • 深圳南澳码头工程环评将再次举行听证会,项目与珊瑚最近距离仅80米
  • 普京调整俄陆军高层人事任命
  • 李峰已任上海青浦区委常委
  • 国际奥委会举办研讨会,聚焦如何杜绝操纵比赛
  • 由我国牵头制定,适老化数字经济国际标准发布
  • 全国人大常委会今年将初次审议检察公益诉讼法