在 React Router 开发中,useNavigate(); 和 redirect(从 react-router 导入)是 React Router 中用于导航的两种不同工具,它们适用于不同的场景,并且在使用方式和功能上有明显区别。以下是它们的主要区别:
1. useNavigate 钩子
- 来源:
useNavigate是 React Router v6 提供的一个钩子(Hook),通过react-router-dom导入。 - 用途:用于在函数组件中以编程方式导航到其他路由。
- 使用方式:
- 调用
useNavigate获取一个navigate函数。 - 使用
navigate函数跳转到指定路径,或者通过相对路径、前进/后退操作进行导航。
- 调用
- 场景:适合在事件处理函数(如点击按钮)或条件逻辑中触发导航。
- 特点:
- 更加灵活,可以传递选项(如
state、replace等)。 - 支持相对导航(例如
navigate(-1)表示后退一步)。 - 完全基于客户端路由。
- 更加灵活,可以传递选项(如
- 示例:
import { useNavigate } from "react-router-dom"; function MyComponent() { let navigate = useNavigate(); const handleClick = () => { navigate("/new-page"); // 跳转到 /new-page // 或者带状态 navigate("/new-page", { state: { key: "value" } }); // 或者后退 navigate(-1); }; return <button onClick={handleClick}>Go to New Page</button>; }
2. redirect 函数
- 来源:
redirect是 React Router v6 提供的一个工具函数,通常用于**路由加载器(loader)或动作(action)**中。 - 用途:主要用于在服务端逻辑(如数据加载或表单提交)中返回一个重定向响应,告诉 React Router 将用户导航到另一个路由。
- 使用方式:
- 在
loader或action函数中调用redirect并返回其结果。 - 通常与 React Router 的数据 API(Data Router)一起使用。
- 在
- 场景:适合在服务器端逻辑或路由处理中执行重定向,例如用户未登录时重定向到登录页面。
- 特点:
- 专门为路由的
loader和action设计,通常不直接在组件中使用。 - 返回一个 HTTP 重定向响应,React Router 会处理并导航到新路径。
- 更适合声明式路由逻辑。
- 专门为路由的
- 示例:
import { redirect } from "react-router-dom"; // 在 loader 中使用 export async function loader() { const user = await getUser(); if (!user) { return redirect("/login"); // 重定向到登录页面 } return { user }; }
主要区别
| 特性 | useNavigate | redirect |
|---|---|---|
| 来源 | React Router v6 的 Hook | React Router v6 的工具函数 |
| 使用场景 | 组件中,事件驱动或条件导航 | 路由的 loader 或 action 中 |
| 调用位置 | 函数组件内部 | 路由配置的 loader 或 action 函数中 |
| 导航方式 | 客户端导航,动态触发 | 服务端逻辑,返回重定向响应 |
| 灵活性 | 支持前进/后退、传递 state、替换历史记录等 | 仅用于返回重定向路径 |
| 典型用例 | 按钮点击、表单提交后跳转 | 未登录时重定向、表单处理后重定向 |
总结
- 如果你需要在组件内部基于用户交互或条件进行导航,使用
useNavigate。 - 如果你需要在路由的
loader或action中处理逻辑并返回重定向,使用redirect。 - 两者都服务于导航,但适用场景和使用方式完全不同。
useNavigate更适合动态、客户端的导航,而redirect更适合路由逻辑中的声明式重定向。
我正在基于最新的7.5版,编写一本React Router v7的图文专栏,关注RR7的宝子们可以订阅我的公众号了解详情。