路由守卫在后台管理系统两种经典的跳转情况:
- 如果访问的是登录页面, 并且有token, 跳转到首页
- 如果访问的不是登录页面,并且没有token, 跳转到登录页
- 其余的都可以正常放行
下面简单实现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
总结:路由守卫其实是一个根据登录状态返回不同组件的组件