React导航守卫(V6路由)

本文介绍了如何在React应用中使用`react-router-dom`实现登录后才能访问特定页面的功能,包括存储token、使用高阶组件进行路由拦截和确保只有登录用户才能看到首页内容。

下载:

npm i react-router-dom

当登录之后才可以去访问其他页面

(1)在登录页面,我们点击登录的时候,保存一个token,在登录页面引入重定向useNavigate

import { useNavigate } from 'react-router-dom'

const navigate = useNavigate()

const login = () => {
    //点击登录时,存入token并重定向首页面
    sessionStorage.token = "123"
    navigate("/home")
}

<button type="button" onclick={login}>登录</button>

(2)在存放路由的文件中,封装一个高阶组件

封装一个高阶组件(其实就是函数,这个函数要接收一个组件作为参数,返回一个组件)

const AuthComponents = props => {
    //获取到当前组件
    const Com = props.children.type;
    //列表token是否存在
    if(sessionstorage.token){
        return <Com />
    }else{
        return <Navigate to="/login">
    }
}

(3)当我们给首页加入一个拦截,就可以使用<AuthComponents></AuthComponents>包裹起来

例如:

{
    path:'/home',
    element:<AuthComponents><Home /></AuthComponents>
}

### 实现 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、付费专栏及课程。

余额充值