react-导航守卫

在react中不像vue有专门的导航守卫,react路由实际上也是组件,利用组件的表达式制作配置导航守卫

路由原配置:<Route exact={true} strict={true} exact path='/home' component={Home} />

守卫配置:

<Route exact={true} strict={true} exact path='/home' render = {()=>(
isLogin ? (
<Home/>
)
:
(
<Redirect to="/login"/>
)
)}/>

component改成render表达式,添加isLogin判断字段(字段根据登录token等判定)每一个route组件都要配置比较麻烦:好处式不管显示导航与否:如果登录也有导航这时候每个导航按钮都可以切换路由,这样配置的导航不管点击哪个导航都会判断islogin并进入登录或指定页面

需要注意的点:在使用导航守卫方式配置路由的时候:render={()=>(...)}

 注意render时组件内的this.props获取不到history对象,component则可以如果用到在login组件内使用高阶函数:withRouter 

<Route exact={true} strict={true} exact path='/login' render={()=>(
<Login isLogin = {this.handlerLoginstatus}/>
)} />

这样在login组件内 就可以获取到props内的history对象了

整体步骤总结:

1:增加判断条件和isLogin辨析值

2:route配置改写render渲染判断组件

复制代码
 <Route exact={true} strict={true} exact path='/home' render = {()=>(
                       isLogin ? (
                        <Home/>
                       )
                        :
                       (
                        <Redirect to="/login"/>
                       )
                   )}/>
复制代码

3:login路由内渲染的login组件增加自定义事件用于子组件登录成功后通知跳转首页

<Route exact={true} strict={true} exact path='/login' render={()=>(
                        <Login isLogin = {this.handlerLoginstatus}/>
                   )} />
 handlerLoginstatus(){//子组件通知父组件更新登录状态-不然不会自动跳转到首页的
        console.log('handlerstatus触发了')
        this.setState({
            isLogin: true
        })
        console.log(this.state.isLogin)
    }

login.jsx

isLoginF(){
        this.props.isLogin()
        // 注意render时组件内的this.props获取不到history对象,component则可以如果用到在login组件内使用高阶函数:withRouter 
        console.log(this.props)
    }

如果不通知 登陆后跳转到首页将不会被更新因为判断的值isLogin更改后并没有刷新只是子组件更改了值所以要通知父组件更新isLogin值

子传父用自定义事件

posted @   少哨兵  阅读(1150)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示