React路由导航

本文介绍了JavaScript路由导航的基本概念,包括路由跳转、声明式导航(通过模板的<Link>组件)和编程式导航(useNavigate钩子),以及如何在跳转时传递参数。

1. 什么是路由导航

一个路由跳转到另一个路由,并且在跳转的同时有可能需要传递参数进行通信,比如列表页跳转到详情页携带参数
在这里插入图片描述

2. 声明式导航

声明式导航是指通过在模版中通过 <Link/> 组件描述出要跳转到哪里去,比如后台管理系统的左侧菜单通常使用这种方式进行

在这里插入图片描述
语法说明:通过给组件的to属性指定要跳转到路由path,组件会被渲染为浏览器支持的a链接,如果需要传参直接通过字符串拼接的方式拼接参数即可

3. 编程式导航

编程式导航是指通过 useNavigate 钩子得到导航方法,然后通过调用方法以命令式的形式进行路由跳转,比如想在登录请求完毕之后跳转就可以选择这种方式,更加灵活

在这里插入图片描述
语法说明:通过调用navigate方法传入地址path实现跳转
应用场景:1.按钮跳转,2.js方法跳转

导航传参

在这里插入图片描述
别忘了param传参需要在路由上加上对应的:id

{
    path: '/article/:id/:name',
    element: <Article />
 }```
  
### 实现 React 中的路由导航守卫 在 React 应用程序中,可以通过多种方式实现路由导航守卫。以下是基于 `react-router` 的几种常见实现方法。 #### 方法一:使用高阶组件(Higher-Order Component) 通过创建一个高阶组件来封装路由逻辑,可以轻松实现路由守卫功能。下面是一个典型的例子: ```javascript import React from 'react'; import { Route, Redirect } from 'react-router-dom'; const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => ( <Route {...rest} render={(props) => isAuthenticated ? ( <Component {...props} /> ) : ( <Redirect to={{ pathname: '/login', state: { from: props.location }, }} /> ) } /> ); export default PrivateRoute; ``` 上述代码定义了一个名为 `PrivateRoute` 的高阶组件[^2]。它接受两个主要参数:`component` 和 `isAuthenticated`。当用户未登录 (`isAuthenticated === false`) 时,会重定向到 `/login` 页面;否则允许访问目标页面。 --- #### 方法二:React Router v6 中的自定义守卫 随着 React Router 升级至版本 6,API 发生了一些变化。推荐的方式是利用 `useEffect` 或者自定义钩子函数配合路由渲染逻辑完成守卫操作。以下是一个示例: ```javascript // RoutingGuard.js import React from 'react'; import { Navigate, Outlet } from 'react-router-dom'; const RoutingGuard = ({ isAuthenticated }) => { if (!isAuthenticated) { return <Navigate to="/login" replace />; } return <Outlet />; }; export default RoutingGuard; // 使用场景 import React from 'react'; import { Routes, Route } from 'react-router-dom'; import Home from './pages/Home'; import Login from './pages/Login'; import Dashboard from './pages/Dashboard'; import RoutingGuard from './RoutingGuard'; function App() { const isAuthenticated = localStorage.getItem('token'); // 假设 token 存储于本地存储 return ( <Routes> <Route path="/" element={<Home />} /> <Route path="dashboard" element={ <RoutingGuard isAuthenticated={!!isAuthenticated}> <Dashboard /> </RoutingGuard> } /> <Route path="login" element={<Login />} /> </Routes> ); } export default App; ``` 在这个例子中,`RoutingGuard` 是一个简单的组件,用于判断当前用户的认证状态并决定是否继续加载受保护的内容[^3]。如果用户未经过身份验证,则会被自动重定向到登录页。 --- #### 方法三:动态跳转与导航控制 除了静态声明式的路由守卫外,还可以借助 `useNavigate` 钩子实现在特定事件触发下的动态跳转行为。例如,在表单提交成功后或者按钮点击时执行条件性的页面切换。 ```javascript import React from 'react'; import { useNavigate } from 'react-router-dom'; const UserLogin = () => { const navigate = useNavigate(); const handleLoginSuccess = () => { // 模拟异步请求完成后跳转 setTimeout(() => { navigate('/home'); }, 1000); }; return ( <div> <h1>Login Page</h1> <button onClick={handleLoginSuccess}>Log In</button> </div> ); }; export default UserLogin; ``` 此片段展示了如何手动调用 `navigate` 函数来进行页面间的转换[^5]。这种方式特别适合处理复杂的业务流程,比如支付确认后的订单详情展示等。 --- ### 总结 以上三种方案分别适用于不同需求层次的应用开发环境: 1. **高阶组件** 方便快速搭建基础版权限管理; 2. **v6 自定义守卫** 更加灵活且贴近现代框架设计理念; 3. **动态跳转机制** 则提供了额外的操作自由度以应对特殊交互需求。 无论采用哪种技术路径,核心思路始终围绕着拦截非法访问以及引导合法用户进入对应界面展开设计。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值