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 中已被移除。

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

相关推荐
闲猫2 分钟前
Python FastAPI + SQLAlchemy 入门教程:从零搭建你的第一个 Web 应用
前端·python·fastapi
林小帅26 分钟前
NestJS v11 + Prisma v7 ESM 迁移配置解析
前端·javascript·后端
IT_陈寒42 分钟前
React的setState竟然不是立刻生效的,害我调试半天
前端·人工智能·后端
简简单单就是我_hehe1 小时前
前端埋点日志解决方案:完整 User-Agent 解析工具实现,爬虫识别、设备品牌、操作系统、浏览器版本全解析(附完整源码)
前端·爬虫
William_Xu2 小时前
Vue 2 与 Vue 3 生命周期对比
前端
Hilaku2 小时前
为什么你的大文件断点续传,一遇到弱网就崩溃?
前端·javascript·程序员
胡哈3 小时前
React Compiler:让开发者忘掉 memo 这件事
前端·react.js
xiyueyezibile3 小时前
“自迭代” Skill 的 team-pitfalls 的演进
前端·后端·ai编程
林恒smileZAZ3 小时前
`Array(100).map(() => 1)` 为什么全为空?
前端·javascript
小巧的砖头3 小时前
C#会重蹈覆辙吗?系列之2:反射及元数据的性能问题
开发语言·前端·c#