react 路由权限守卫

系统管理员 2022-12-13 01:48 328阅读 0赞

在这里插入图片描述

app.js

  1. // 路由
  2. import { HashRouter as Router,Route,NavLink,Redirect,Switch,useHistory} from 'react-router-dom'
  3. // 导入哈希路由(BrowserRouter浏览器路由)起别名叫Router
  4. // Route 路由页面,NavLink 路由导航页面
  5. import React, { Component } from 'react';
  6. import "./App.css";
  7. class App extends Component {
  8. render() {
  9. return (
  10. <Router>
  11. <p>
  12. <NavLink to="/" exact>首页</NavLink> |
  13. <NavLink to="/about">关于</NavLink> |
  14. <NavLink to="/product/abc">产品abc</NavLink> |
  15. <NavLink to="/product/123">产品123</NavLink> |
  16. <NavLink to="/admin">管理</NavLink> |
  17. <NavLink to="/private">私密</NavLink> |
  18. <NavLink to="/login">登录</NavLink> |
  19. </p>
  20. <Switch>
  21. <Route path="/" exact component={ Home}></Route>
  22. { /* <Route path="/about" component={About}></Route> */}
  23. <Route path="/product/:id" component={ Product}></Route>
  24. <Route path="/admin" component={ Admin}></Route>
  25. <Route path="/login" component={ Login}></Route>
  26. <PrivatePage path="/private">
  27. <Private></Private>
  28. </PrivatePage>
  29. <PrivatePage path="/about">
  30. <About></About>
  31. </PrivatePage>
  32. <Route component={ NoMatch}></Route>
  33. </Switch>
  34. </Router>
  35. );
  36. }
  37. }
  38. export default App;
  39. // 权限处理
  40. // Private 登录后 可以进入,没有登录跳转到 login 登录页面
  41. // Login 登录页面
  42. // PrivatePage 页面(需要权限页面都包裹再里面)
  43. // fakeAuth登录状态记录 isAuth 是否登录 | authentic 授权登录方法 signout 注销方法
  44. const fakeAuth = {
  45. isAuth:false, //默认非登录状态
  46. authentic(cb){
  47. this.isAuth = true;//登录状态
  48. setTimeout(cb,200);//cb登录成功后要做的callback回调函数
  49. },
  50. signout(cb){
  51. this.isAuth = false;//非登录状态
  52. setTimeout(cb,300);//cb注销成功后要做的callback回调函数
  53. }
  54. }
  55. // 所有需要权限页面都放入内部 render 属性
  56. function PrivatePage({ children}){
  57. return <Route render={ ({ location,...rest})=>{
  58. let component = React.cloneElement(children,rest);
  59. // chilren 基础了 父组件的所有属性 history,match,赋值给component
  60. // return fakeAuth.isAuth?component:<Redirect to={ {pathname:"/login",state:{from:location}}}/>
  61. return fakeAuth.isAuth?children:<Redirect to={ { pathname:"/login",state:{ from:location}}}/>
  62. }}/>
  63. // 通过state 传递当前location
  64. }
  65. function Private(props){
  66. let history = useHistory();//通过hooks方式拿到history
  67. // let history = props.history;
  68. return(<div>
  69. <h1>私密页面</h1>
  70. <button onClick={ ()=>{
  71. fakeAuth.signout(()=>{ history.replace("/");
  72. // 注销完毕跳转到首页
  73. })
  74. }}>注销</button>
  75. </div>)
  76. }
  77. function Login(props){
  78. let { from} = props.location.state||{ from:{ pathname:"/"}};
  79. // 通过props接收传递过来state也就是上一个页面的location ||默认首页
  80. return (<div>
  81. <h1>登录页面</h1>
  82. <button onClick={ ()=>{
  83. fakeAuth.authentic(()=>{
  84. props.history.replace(from)
  85. })
  86. }}>登录</button>
  87. </div>)
  88. }
  89. function NoMatch({ location}){
  90. // console.log(location,"location")
  91. // location当前页面地址栏解析 pathname 地址 query查询 hash哈希值
  92. return (<div>
  93. 您的页面被外星人绑架了 <br/>
  94. 找不页面: { location.pathname}<br/>
  95. <NavLink to="/" exact>回首页</NavLink>
  96. </div>)
  97. }
  98. function Admin({ match,location}){
  99. return(
  100. <div className="admin" >
  101. <div className="leftNav" >
  102. <NavLink to={ match.url+"/user"}>用户管理</NavLink><br/>
  103. <NavLink to={ match.url+"/order"}>订单管理</NavLink>
  104. </div>
  105. <div className="content">
  106. <Route path={ match.url+"/user"} component={ User}></Route>
  107. <Route path={ match.url+"/order"} component={ Order}></Route>
  108. { match.url==='/admin'?<Redirect from={ match.url} to={ match.url+"/order"} ></Redirect>:""}
  109. </div>
  110. </div>)
  111. }
  112. function User({ match,location,history}){
  113. console.log("user",match,location,history)
  114. return (<div>
  115. 用户管理页面
  116. </div>)
  117. }
  118. function Order({ history}){
  119. return (<div>
  120. <button onClick={ ()=>history.goBack()}>返回</button> |
  121. <button onClick={ ()=>history.push("/")}>首页</button>
  122. <button onClick={ ()=>history.replace("/")}>首页-repalce</button>
  123. <button onClick={ ()=>history.push({ pathname:"/about",search:"?name=mumu&age=18",hash:"#good",state:{ big:"super"}})}>about</button>
  124. 订单管理页面
  125. </div>)
  126. }
  127. function Product({ match}){
  128. // console.log(match) //匹配的路由项 params 参数 url匹配的地址
  129. return (<div>产品页面{ match.params.id}</div>)
  130. }
  131. function Home(){
  132. return (<div>首页页面</div>)
  133. }
  134. function About({ location}){
  135. console.log("about",location)
  136. return (<div>关于我们页面</div>)
  137. }

app.css

  1. .App {
  2. text-align: center;
  3. }
  4. .App-logo {
  5. height: 40vmin;
  6. pointer-events: none;
  7. }
  8. @media (prefers-reduced-motion: no-preference) {
  9. .App-logo {
  10. animation: App-logo-spin infinite 20s linear;
  11. }
  12. }
  13. .App-header {
  14. background-color: #282c34;
  15. min-height: 100vh;
  16. display: flex;
  17. flex-direction: column;
  18. align-items: center;
  19. justify-content: center;
  20. font-size: calc(10px + 2vmin);
  21. color: white;
  22. }
  23. .App-link {
  24. color: #61dafb;
  25. }
  26. @keyframes App-logo-spin {
  27. from {
  28. transform: rotate(0deg);
  29. }
  30. to {
  31. transform: rotate(360deg);
  32. }
  33. }
  34. .admin{
  35. display:flex;
  36. height: 80vh;
  37. margin: 10px;
  38. }
  39. .leftNav{
  40. width:200px;
  41. border-right: 1px solid #61dafb;
  42. }
  43. .content{
  44. flex: 1;
  45. }

发表评论

表情:
评论列表 (有 0 条评论,328人围观)

还没有评论,来说两句吧...

相关阅读

    相关 react前置守卫

    react中一切皆组件--2018.7.18 目标:自定义user界面的前置路由守卫,当用户点击要进入user组件时,路由守卫发起判断,如果条件满足则进入,否则跳转至l

    相关 react 守卫

    原理 `react路由守卫` 是通过 `高阶组件(HOC)` 实现的 因此针对不同的情况就要封装不同的 `HOC` 接下来展示一个有关登录权限的路由守卫例子 demo