React中简单实现路由守卫(主要演示其原理)

本文介绍了如何在React应用中实现一个简单的路由守卫,根据用户登录状态决定是重定向到登录页还是首页,展示了使用`useRoutes`、`useLocation`和`useNavigate`等ReactRouterDOMhook的功能。
摘要由CSDN通过智能技术生成

路由守卫在后台管理系统两种经典的跳转情况:

  1.     如果访问的是登录页面, 并且有token, 跳转到首页
  2.     如果访问的不是登录页面,并且没有token, 跳转到登录页
  3.     其余的都可以正常放行

下面简单实现React路由守卫功能(代码比较简单,主要演示其原理

具体代码如下:

import { useEffect } from 'react'
import { useRoutes, useLocation,useNavigate } from "react-router-dom"
import router from "./router"
import { message } from "antd"

// 去往登录页的组件
function ToLogin(){
  const navigateTo = useNavigate()
  useEffect(()=>{
    navigateTo("/login");
    message.warning("您还没有登录,请登录后再访问!");
  },[])
  return <div></div>
}

// 去往首页的组件
function ToPage1(){
  const navigateTo = useNavigate()
  useEffect(()=>{
    navigateTo("/home");
    message.warning("您已经登录过了!");
  },[])
  return <div></div>
}

// 手写封装路由守卫
function BeforeRouterEnter(){
  const outlet = useRoutes(router);
    const location = useLocation()
    let token = localStorage.getItem("lege-react-management-token");
    //1、如果访问的是登录页面, 并且有token, 跳转到首页
    if(location.pathname==="/login" && token){
      // 这里不能直接用 useNavigate 来实现跳转 ,因为需要BeforeRouterEnter是一个正常的JSX组件
      return <ToPage1 />
    }
    //2、如果访问的不是登录页面,并且没有token, 跳转到登录页
    if(location.pathname!=="/login" && !token){
      return <ToLogin />
    }
    return outlet
}


function App() {  
  return (
    <div className="App">
      {/* {路由守卫其实是一个根据登录状态返回不同组件的组件} */}
      <BeforeRouterEnter />
    </div>
  )
}

export default App

总结:路由守卫其实是一个根据登录状态返回不同组件的组件

React实现路由守卫可以使用React Router库来帮助管理路由和导航。React Router提供了一种简单的方式来实现路由守卫,可以通过定义适当的组件来控制页面访问权限。 以下是一个基本的示例,展示了如何使用React Router实现路由守卫: 1. 首先,安装React Router库: ``` npm install react-router-dom ``` 2. 在你的应用程序导入所需的模块: ```jsx import { BrowserRouter as Router, Route, Switch, Redirect } from 'react-router-dom'; ``` 3. 定义一个私有路由组件,用于验证用户是否有权限访问特定页面。需要传入以下参数:`component`(要渲染的组件)、`isAuthenticated`(表示用户是否已经登录)、`...rest`(其他包含路由参数的属性)。 ```jsx const PrivateRoute = ({ component: Component, isAuthenticated, ...rest }) => ( <Route {...rest} render={(props) => isAuthenticated ? ( <Component {...props} /> ) : ( <Redirect to="/login" /> // 没有权限,重定向到登录页面 ) } /> ); ``` 4. 在应用程序的根组件设置路由和路由守卫。这将包裹整个应用程序,并根据需要定义私有和公共路由。 ```jsx const App = () => { const isAuthenticated = checkUserAuthentication(); // 检查用户是否已经登录 return ( <Router> <Switch> <Route exact path="/login" component={Login} /> // 公共路由,任何人都可以访问 <PrivateRoute path="/dashboard" component={Dashboard} isAuthenticated={isAuthenticated} // 私有路由,需要用户登录才能访问 /> </Switch> </Router> ); }; ``` 在上述代码,`<PrivateRoute>` 组件用于保护需要用户登录才能访问的页面(例如仪表板)。如果用户未经身份验证,将重定向到登录页面。 请注意,上述示例的 `checkUserAuthentication` 函数是一个示例,你需要根据实际需求自行实现。 这就是使用React Router实现基本的路由守卫的方法。你可以根据具体项目需求进行更复杂的路由守卫逻辑的实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农键盘上的梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值