react 路由权限守卫[通俗易懂]

react 路由权限守卫[通俗易懂]app.js//路由import{HashRouterasRouter,Route,NavLink,Redirect,Switch,useHistory}from’react-router-dom’//导入哈希路由(BrowserRouter浏览器路由)起别名叫Router//Route路由页面,NavLink路由导航页面importReact,{Component}from’react’;import”./App.css”;classApp.

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

在这里插入图片描述

app.js

// 路由
import { 
   HashRouter as Router,Route,NavLink,Redirect,Switch,useHistory} from 'react-router-dom'
// 导入哈希路由(BrowserRouter浏览器路由)起别名叫Router
// Route 路由页面,NavLink 路由导航页面
import React, { 
    Component } from 'react'; 
import "./App.css";
 
 
class App extends Component { 
    
  render() { 
   
    return (
      <Router>
        <p> 
          <NavLink to="/" exact>首页</NavLink>  | 
          <NavLink to="/about">关于</NavLink>  | 
          <NavLink to="/product/abc">产品abc</NavLink>   | 
          <NavLink to="/product/123">产品123</NavLink>   | 
          <NavLink to="/admin">管理</NavLink>   | 
          <NavLink to="/private">私密</NavLink>   | 
          <NavLink to="/login">登录</NavLink>   | 
         
        </p>
        <Switch>
          <Route path="/" exact component={ 
   Home}></Route>
          { 
   /* <Route path="/about" component={About}></Route> */}
          <Route path="/product/:id"  component={ 
   Product}></Route>
          <Route path="/admin"  component={ 
   Admin}></Route>     
          <Route path="/login"  component={ 
   Login}></Route> 

          <PrivatePage path="/private">
            <Private></Private>
          </PrivatePage>
          <PrivatePage path="/about">
            <About></About>
          </PrivatePage>


          <Route   component={ 
   NoMatch}></Route>
        </Switch>
      </Router>
    );
  }
}



export default App;
// 权限处理
// Private 登录后 可以进入,没有登录跳转到 login 登录页面
// Login 登录页面
// PrivatePage 页面(需要权限页面都包裹再里面)
// fakeAuth登录状态记录 isAuth 是否登录 | authentic 授权登录方法 signout 注销方法
const fakeAuth = { 
   
  isAuth:false, //默认非登录状态
  authentic(cb){ 
   
    this.isAuth = true;//登录状态
    setTimeout(cb,200);//cb登录成功后要做的callback回调函数
  },
  signout(cb){ 
   
    this.isAuth = false;//非登录状态
    setTimeout(cb,300);//cb注销成功后要做的callback回调函数
  }
}
// 所有需要权限页面都放入内部 render 属性
function PrivatePage({ 
   children}){ 
   
    return <Route render={ 
   ({ 
   location,...rest})=>{ 
   
      let component = React.cloneElement(children,rest);
      // chilren 基础了 父组件的所有属性 history,match,赋值给component
      // return fakeAuth.isAuth?component:<Redirect to={ 
   {pathname:"/login",state:{from:location}}}/>
      return fakeAuth.isAuth?children:<Redirect to={ 
   { 
   pathname:"/login",state:{ 
   from:location}}}/>
    }}/>
    // 通过state 传递当前location
}

function Private(props){ 
   
  let history = useHistory();//通过hooks方式拿到history
    // let history = props.history;
  return(<div>
    <h1>私密页面</h1>
    <button onClick={ 
   ()=>{ 
   
      fakeAuth.signout(()=>{ 
   history.replace("/");
        // 注销完毕跳转到首页
      })
    }}>注销</button>
  </div>)
}
function Login(props){ 
   
  let { 
   from} = props.location.state||{ 
   from:{ 
   pathname:"/"}};
  // 通过props接收传递过来state也就是上一个页面的location ||默认首页
  return (<div>
    <h1>登录页面</h1>
    <button onClick={ 
   ()=>{ 
   
      fakeAuth.authentic(()=>{ 
   
        props.history.replace(from)
      })
    }}>登录</button>
  </div>)
}




function NoMatch({ 
   location}){ 
   
    // console.log(location,"location")
    // location当前页面地址栏解析 pathname 地址 query查询 hash哈希值
  return (<div>
    您的页面被外星人绑架了 <br/>
    找不页面: { 
   location.pathname}<br/>
    <NavLink to="/" exact>回首页</NavLink>
  </div>)
}
function Admin({ 
   match,location}){ 
   

  return(
  <div className="admin" >
    <div className="leftNav" >
      <NavLink to={ 
   match.url+"/user"}>用户管理</NavLink><br/>
      <NavLink to={ 
   match.url+"/order"}>订单管理</NavLink>
    </div>
    <div className="content">
      <Route path={ 
   match.url+"/user"} component={ 
   User}></Route>
      <Route path={ 
   match.url+"/order"} component={ 
   Order}></Route>
      { 
   match.url==='/admin'?<Redirect   from={ 
   match.url} to={ 
   match.url+"/order"} ></Redirect>:""}
    </div>
  </div>)
}
function User({ 
   match,location,history}){ 
   
  console.log("user",match,location,history)
  return (<div>
    用户管理页面
  </div>)
}
function Order({ 
   history}){ 
   
  return (<div>
    <button onClick={ 
   ()=>history.goBack()}>返回</button> |
    <button onClick={ 
   ()=>history.push("/")}>首页</button>
    <button onClick={ 
   ()=>history.replace("/")}>首页-repalce</button>
    <button onClick={ 
   ()=>history.push({ 
   pathname:"/about",search:"?name=mumu&age=18",hash:"#good",state:{ 
   big:"super"}})}>about</button>
    订单管理页面
  </div>)
}

function Product({ 
   match}){ 
   
  // console.log(match) //匹配的路由项 params 参数 url匹配的地址
return (<div>产品页面{ 
   match.params.id}</div>)
}
function Home(){ 
   
  return (<div>首页页面</div>)
}


function About({ 
   location}){ 
   
  
  console.log("about",location)
  return (<div>关于我们页面</div>)
}
 
 

app.css

.App { 
   
  text-align: center;
}

.App-logo { 
   
  height: 40vmin;
  pointer-events: none;
}

@media (prefers-reduced-motion: no-preference) { 
   
  .App-logo { 
   
    animation: App-logo-spin infinite 20s linear;
  }
}

.App-header { 
   
  background-color: #282c34;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  font-size: calc(10px + 2vmin);
  color: white;
}

.App-link { 
   
  color: #61dafb;
}

@keyframes App-logo-spin { 
   
  from { 
   
    transform: rotate(0deg);
  }
  to { 
   
    transform: rotate(360deg);
  }
}

.admin{ 
   
  display:flex;
  height: 80vh;
  margin: 10px;
}
.leftNav{ 
   
  width:200px;
  border-right: 1px solid #61dafb;
}
.content{ 
   
  flex: 1;
}




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

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

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


相关推荐

  • Python基础知识点梳理

    Python基础知识点梳理python常见知识点梳理摘要:本文主要介绍一些平时经常会用到的python基础知识点,用于加深印象。python的详细语法介绍可以查看官方编程手册,也有一些在线网站对python语法进行了比较全面的介绍,比如菜鸟教程:python3教程|菜鸟教程本文主要是介绍基础语法,操作实例在另一篇博客中单独介绍:python语言介绍python是一门解释型语言,python的设计目标:一门…

    2022年6月24日
    26
  • 使用R中merge()函数合并数据[通俗易懂]

    使用R中merge()函数合并数据[通俗易懂]使用R中merge()函数合并数据在R中可以使用merge()函数去合并数据框,其强大之处在于在两个不同的数据框中标识共同的列或行。如何使用merge()获取数据集中交叉部分merge()最简单的形式为获取两个不同数据框中交叉部分。举例,获取cold.states和large.states完全匹配的数据。代码如下:&gt;merge(cold.states,large….

    2022年6月14日
    50
  • C++键盘钩子

    C++键盘钩子C++键盘钩子Windows系统是建立在事件驱动的机制上的,整个系统都是通过消息传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的…

    2022年4月26日
    45
  • 网络规划与设计「建议收藏」

    网络规划与设计「建议收藏」一、网络生命周期网络生命周期就是网络系统从思考、调查、分析、建设到最后淘汰的总过程。常见的网络生命周期是四阶段周期模型、五阶段周期模型、六阶段周期模型。1.四阶段周期模型特点:能够快速适应新的

    2022年7月3日
    25
  • 架构学习——业务架构图

    架构学习——业务架构图一、什么是业务架构图?业务架构图,顾名思义就是对于产品的业务架构进行梳理和整合,它表达的是业务系统之间的关系,帮助开发人员梳理业务结构。二、为什么要画业务架构图?业务架构图帮我们更好的从宏观的角度整体性的审查我们的产品帮助用户和需求方从业务角度出发更好的了解我们的产品功能有了业务架构图我们可以更好的对目前已有的功能和以后计划开发的功能进行抽象、设计、开发三、如何画业务架构图?站在巨人的肩膀上我们要学会站在巨人的肩膀上学习,先看看一些比较牛的公司他们是怎么画的业务架构图,借鉴他人的画法和思

    2022年10月7日
    2
  • 小程序的图片上传wx.uploadFile及后台PHP接收文件并存储到服务器[通俗易懂]

    小程序的图片上传wx.uploadFile及后台PHP接收文件并存储到服务器[通俗易懂]前台代码wxml:<buttonbindtap=’chooseImg’>选择图片</button>//图片选择<view><imagesrc='{{img_l}}’bindtap=’preview_img’></image></view>//图片预览<buttonbindtap=’up_img’…

    2022年6月17日
    48

发表回复

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

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