react 路由跳转的几种方式

在 React 中,路由跳转通常通过 react-router-dom(或类似的路由库)来实现。以下是几种常见的路由跳转方式:

1. 使用 <Link> 组件

<Link> 是最简单的路由跳转方式,它会生成一个 <a> 标签,点击后可以导航到指定的路由,而不会重新加载页面。

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

function App() {
  return (
    <div>
      <h1>Home Page</h1>
      <Link to="/about">Go to About</Link>
    </div>
  );
}

特点:

  • 适合用于页面级的导航。
  • 不会触发页面重新加载,而是通过 React Router 的内部机制更新页面内容。

2. 使用 <NavLink> 组件

<NavLink><Link> 的一个变体,它会在当前路由匹配时自动添加一个样式类(如 active),非常适合用于导航栏。

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

function App() {
  return (
    <nav>
      <NavLink to="/" exact activeClassName="active">
        Home
      </NavLink>
      <NavLink to="/about" activeClassName="active">
        About
      </NavLink>
    </nav>
  );
}

特点:

  • <Link> 类似,但提供了额外的样式控制。
  • 适合用于导航栏或侧边栏。

3. 使用 useHistory 钩子(React Router v5)

在 React Router v5 中,useHistory 钩子可以用于编程式导航。它允许你在代码中控制路由跳转。

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

function LoginButton() {
  const history = useHistory();

  const handleClick = () => {
    history.push("/dashboard");
  };

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

特点:

  • 适合在事件处理函数中进行路由跳转。
  • 可以传递查询参数或状态。

4. 使用 useNavigate 钩子(React Router v6)

在 React Router v6 中,useHistory 被替换为 useNavigate,功能类似但更简洁。

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

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

  const handleClick = () => {
    navigate("/dashboard");
  };

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

特点:

  • 替代了 v5 中的 useHistory
  • 更简洁的 API 设计。

5. 使用 <Redirect> 组件(React Router v5)

<Redirect> 是一种在组件中实现路由跳转的方式,通常用于条件渲染。它会在渲染时直接跳转到指定路由。

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

function PrivateRoute({ isLoggedIn }) {
  return isLoggedIn ? <Dashboard /> : <Redirect to="/login" />;
}

特点:

  • 适合用于权限控制或条件跳转。
  • 在 React Router v6 中,<Redirect> 被移除,推荐使用 navigate 或其他方式替代。

在 React Router v6 中,navigate 函数不仅可以用于编程式导航,还可以实现相对路径跳转。

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

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

  const handleClick = () => {
    navigate(-1); // 返回上一页
  };

  return <button onClick={handleClick}>Go Back</button>;
}

特点:

  • 支持相对路径跳转(如 navigate(-1) 返回上一页)。
  • 更灵活的路由控制。

7. 使用 history 对象(自定义路由库)

如果你使用的是自定义路由库(如 history),可以通过 history.pushhistory.replace 方法实现跳转。

jsx 复制代码
import { useHistory } from "history";

function LoginButton() {
  const history = useHistory();

  const handleClick = () => {
    history.push("/dashboard");
  };

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

特点:

  • 适合在不使用 React Router 的情况下实现路由跳转。
  • 需要手动配置 history 对象。

总结

  • <Link><NavLink>:适合页面级导航,简单易用。
  • useNavigateuseHistory:适合编程式导航,适合在事件处理函数中使用。
  • navigate 函数:适合更灵活的路由控制,支持相对路径。
  • <Redirect>:适合条件跳转,但在 React Router v6 中已被移除。

根据你的具体需求选择合适的路由跳转方式即可。

相关推荐
IT_陈寒1 小时前
Python开发者必知的5大性能陷阱:90%的人都踩过的坑!
前端·人工智能·后端
codingWhat2 小时前
介绍一个手势识别库——AlloyFinger
前端·javascript·vue.js
Lee川2 小时前
深度拆解:基于面向对象思维的“就地编辑”组件全模块解析
javascript·架构
代码老中医2 小时前
2026年CSS彻底疯了:这6个新特性让我删掉了三分之一JS代码
前端
进击的尘埃2 小时前
Web Worker 与 OffscreenCanvas:把主线程从重活里解放出来
javascript
不会敲代码12 小时前
Zustand:轻量级状态管理,从入门到实践
前端·typescript
踩着两条虫2 小时前
VTJ.PRO 双向代码转换原理揭秘
前端·vue.js·人工智能
扉川川2 小时前
OpenClaw 架构解析:一个生产级 AI Agent 是如何设计的
前端·人工智能
远山枫谷2 小时前
一文理清页面/组件通信与 Store 全局状态管理
前端·微信小程序
codingWhat2 小时前
手撸一个「能打」的 React Table 组件
前端·javascript·react.js