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页面退出功能报错

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

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