react路由权限设置

react路由权限设置说明在react项目中有时我们的一些页面需要权限才能访问,这里以需要登录才能访问进行的设置在这里可以看到权限页面和关于页面是需要登录才能访问的importReact,{Component,useState,useEffect,useRef}from’react’;import{HashRouterasRouter,Route,NavLink,Redirect,Switch,useHistory}from”react-router-dom”;classAPP

大家好,又见面了,我是你们的朋友全栈君。

说明

在react项目中有时我们的一些页面需要权限才能访问,这里以需要登录才能访问进行的设置
在这里插入图片描述
在这里可以看到权限页面和关于页面是需要登录才能访问的


import React, { 
    Component,useState,useEffect ,useRef} from 'react';
import { 
    HashRouter as Router, Route, NavLink, Redirect, Switch ,useHistory} from "react-router-dom";
class APP extends Component { 
   
  
  render() { 
    
    return ( 
      <div>
        <Router>
          <NavLink to="/">首页</NavLink> | 
          <NavLink to="/about">关于</NavLink> |
          <NavLink to="/login">登录</NavLink> |
          <NavLink to="/private">权限</NavLink> |
      
          <br/>
          <Switch>
          <Route path="/" exact component={ 
   Home}></Route>
          //<Route path="/about" exact component={About}></Route>
          <Route path="/login" exact component={ 
   Login}></Route>
       
          <PrivatePage path="/private">
              <Private></Private>
          </PrivatePage>
            <PrivatePage path="/about">
              <About></About>
          </PrivatePage>
          </Switch>
        </Router>
      </div>
     );
  }
}
 
export default APP;

// 权限处理
// Private 登录后 可以进入,没有登录跳转到 login 登录页面
// Login 登录页面
// PrivatePage 页面(需要权限页面都包裹再里面)
// fakeAuth登录状态记录 isAuth 是否登录 | authentic 授权登录方法 signout 注销方法
const fakeAuth={ 
   
  isAuto:false, //默认非登录状态
  authentic(cb){ 
    
    this.isAuto=true;  //登录状态
    setTimeout(cb,200) //cb登录成功后要做的callback回调函数
  },
  signOut(cb){ 
   
    this.isAuto=false; //非登录状态
    setTimeout(cb,200) //cb注销成功后要做的callback回调函数
  }
}
// 所有需要权限页面都放入内部
function PrivatePage({ 
   children}){ 
   
  return <Route render={ 
   ({ 
   location})=>{ 
   
    //此处应特别注意 要么使得children通过克隆完全继承,要不使用userhistory方法不然退出功能无法找到history方法
     // let component = React.cloneElement(children,rest);
      // chilren 基础了 父组件的所有属性 history,location,match,赋值给component
      // return fakeAuth.isAuth?component:<Redirect to={ 
   {pathname:"/login",state:{from:location}}}/>
    return fakeAuth.isAuto?children:<Redirect to={ 
   { 
   pathname:'/login',state:{ 
   from:location}}}/> //将loacation赋值给from,传递过去
  }}/>
  
  
}

function Home() { 
   
  return (
    <div>
      <h1>首页</h1>
    </div>
  )
}
function About() { 
   
  return (
    <div>
      <h1>关于</h1>
    </div>
  )
}
function Login(props){ 
   
  let { 
   from}=props.location.state || { 
   from:{ 
   pathName:'/'}}
    // console.log(from,'上一个页面的loacation');
  // 通过props接收传递过来state也就是上一个页面的location ||默认首页
  return (
    <div>
      <h1>登录</h1>
      <button onClick={ 
   ()=>{ 
   
        fakeAuth.authentic(()=>{ 
   
          props.history.replace(from)
        })
      }}>按钮</button>
    </div>
  )
}
function Private(){ 
   
  let history=useHistory();//通过hooks方式拿到history

  return (
    <div>
      <p>需要权限的页面</p>
      <button onClick={ 
   ()=>{ 
   
        fakeAuth.signOut(
          history.replace('/login')
        )
      }}>退出</button>
    </div>
  )
}

踩坑的地方

要么使得children通过克隆完全继承,要不使用userhistory方法不然退出功能无法找到history方法
不然 Private页面退出功能报错

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138831.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • activity工作流引擎学习笔记1(初始)

    activity工作流引擎学习笔记1(初始)activiti工作流引擎学习笔记

    2022年7月11日
    17
  • vs2017当前页面的脚本发生错误_win10当前页面脚本发生错误

    vs2017当前页面的脚本发生错误_win10当前页面脚本发生错误今天使用金山卫士对IE8进行组件升级,此后再此使用VS2008查看项目界面中的控件变量类型,或者添加变量,都弹出“当前页面脚本错误”。在网上进行查找。解决办法如下:1、进入到注册表编辑器。2、按照以下路径“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet  Settings\Zones”查看是否存在

    2022年8月30日
    1
  • Linux服务.NO6——http协议

    Linux服务.NO6——http协议9.http9.1.http概念http协议即超文本传输协议,用于从万维网服务器传输超文本到本地浏览器的传送协议。http是基于TCP/IP通信协议来传递数据的一个属于应用层的面向对象的协议。http协议工作于c/s架构,浏览器作为客户端通过url向http服务端(即web服务器)发送所有请求,web服务器根据受到的请求后,向客户端发送响应。9.2.http特点1.简单快速:客户向服务…

    2025年7月24日
    1
  • Python读取excel文件数据并插入数据库[通俗易懂]

    Python读取excel文件数据并插入数据库[通俗易懂]目的:将excel文件StudentInfo.xls的学生信息插入到test库中的student表中一、连接mysql数据库安装第三方库pymysql:pipinstallpymysql调用pymysql.connect()方法连接数据库,代码如下importpymysql#打开数据库连接conn=pymysql.connect(host=’localhost’,#MySQL服务器地址user=’root’,#MySQL服务器端口号p

    2022年9月1日
    5
  • Java Scanner类的常用方法及用法(很详细)

    Java Scanner类的常用方法及用法(很详细)JavaScanner类的方法及用法(很详细)Scanner类简介Java5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用程序。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除…

    2022年7月7日
    23
  • mac navicat prenium 15.0.29 激活码[免费获取]

    (mac navicat prenium 15.0.29 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月21日
    85

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号