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

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

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

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

具体代码如下:

javascript 复制代码
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

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

相关推荐
朱涛的自习室4 小时前
212 个需求、22 万行代码:Agent 接管开源项目的 19 天
android·前端·人工智能
aZhe的全栈知识分享4 小时前
AI 还原 Figma 效果总达不到预期?先别急着让它写代码
前端·后端·面试
review445434 小时前
Codex Hooks 入门实战:生命周期事件、matcher 与5分钟跑通一个钩子
前端·agent·vibecoding
函数小陈4 小时前
阿里云部署DSH与RAM完成运维
前端·后端
用户499335025075 小时前
JS 作用域劫持的死穴:动态 this 穿透,以及 AST 怎么救
前端
IT_陈寒5 小时前
React的setState真是个演员,你以为它同步其实在装睡
前端·人工智能·后端
孟健7 小时前
Claude Code 同需求写两版对比:装不装 frontend-design 差多远?
前端·ai编程·claude
梦de天空一米16889 小时前
【一个重复id让游戏卡在62%,聊聊配置表检查】
前端
ryn483989 小时前
01 一个功能模块,怎么分层才不乱
前端·ai编程·claude
Amos_Web9 小时前
通过 Rspack 源码学 Rust(五):读懂 Result 与问号运算符的错误返回
前端