react前置路由守卫
react中一切皆组件--2018.7.
目标:自定义user界面的前置路由守卫,当用户点击要进入user组件时,路由守卫发起判断,如果条件满足则进入,否则跳转至login组件。
.入口文件index.js中代码如下:
import React,{Component} from 'react';
import ReactDOM from 'react-dom';
import registerServiceWorker from './registerServiceWorker';
import Home from './routes/home'
import {BrowserRouter,Route,Switch,Redirect,NavLink} from 'react-router-dom'
import User from './routes/user';
import Login from './routes/login';
import List from './routes/list';
import Error from './routes/error'
import Authuser from './routes/authuser'
import './assets/link.css'
class App extends Component{
    render(){
        return (
            <div>
                <NavLink activeClassName="link" to="/home" >Home</NavLink>
                <NavLink activeClassName="link" to="/user" >User</NavLink>
                <NavLink activeClassName="link" to="/login" >Login</NavLink>
                <NavLink activeClassName="link" to="/list" >List</NavLink>
                <NavLink activeClassName="link" to="/error" >Error</NavLink>
                <Switch>
                    <Redirect exact from='/' to='/home' />
                    <Route path="/home" component={Home}/>
                    <Authuser path='/user' component={User}/>
                    <Route path="/login" component={Login}/>
                    <Route path="/list" component={List}/>
                    <Route path='/error' component={Error} />
                    <Route component={Error} />
                </Switch>
            </div>
        )
    }
}
ReactDOM.render(
    <BrowserRouter >
     <Route component={App}/>
    </BrowserRouter>,
    document.getElementById('root'));
registerServiceWorker();
其中authuser是我们自定义的组件,当给组件添加path和component两个props后,这个组件会被识别为一个route,因此点击User链接后,会触发Authuser组件
.Authuser的代码如下:
import React,{Component} from 'react';
import {Route,Redirect} from 'react-router-dom'
//函数式组件的写法
// let Authuser = ({component:Component,...rest})=>{
//     return  <Route {...rest} render={(props)=>{
//         return   Math.random() <0.5 ? <Component {...props}/> : <Redirect to='/login' />
//     }}/>
// }
//类组件的写法
class Authuser extends Component{
    constructor(){
        super()
        this.state={
            hasReq:false,
            authuser:false,
            username:"",
            data:{}
        }
    }
    componentDidMount(){
        //组件挂载完毕之后异步读取数据,并更新state
        fetch(
            `/data/data.json`
        ).then(
          (res)=>{
            return res.json()
          }
        ).then((res)=>{
            this.setState(
                {
                    hasReq:true,
                    authuser:res.authuser,
                    username:res.id,
                    data:res.password
                }
            )
        })
    }
    render(){
        let {component:Component,...rest} = this.props
        //解构组件身上的props,将component单独拿出来,如果条件满足,则允许进入该component,将剩余参数放入rest,rest是一个对象
        //此处Component == User
        if (!this.state.hasReq) {return null}
        //组件被触发后会首先渲染一次,但此时state中的hasReq状态未被更新,当此处hasReq未被更新时,我们先不渲染页面,直到组件挂载完毕异步操作返回结果并更新state中的数据后,我们再执行下一步操作
        return (
                //组件最终返回的仍然是一个Route
            <Route {...rest} render={(props)=>{
                //将传递进来的props展开传给Route组件,render函数接收参数props并进行一系列判断,决定路由跳转至哪个组件,同时可以将props继续向下传递
                        return (this.state.authuser?<Component  {...props} username={this.state.username}/> : <Redirect to='/login' />      )
                    }}/>
        )
    }
}
export default Authuser
摘抄保存用的 非原创
react前置路由守卫的更多相关文章
- vue-router4 |name的作用|query传参|parmas传参|动态路由参数|命名视图|别名alias|前置路由守卫|路由过渡效果|滚动行为
		vue-router4 出现 No match found for location with path "/" #### router/index.ts文件 import { c ... 
- 解决vue组件内前置路由守卫beforeRouteEnter无法获取上下文this
		问题描述 vue框架,只有在报名页面报名成功,然后自动跳转到订单详情,才弹出一个引流弹窗,其他情况均不弹出,我就想到使用vue 的组件内前置守卫beforeRouteEnter来实现.beforeRo ... 
- react router @4 和 vue路由 详解(七)react路由守卫
		完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 12.react路由守卫? a.在之前的版本中,React Router 也提供了类似的 ... 
- React Router 4.0 实现路由守卫
		在使用 Vue 或者 Angular 的时候,框架提供了路由守卫功能,用来在进入某个路有前进行一些校验工作,如果校验失败,就跳转到 404 或者登陆页面,比如 Vue 中的 beforeEnter 函 ... 
- react router @4 和 vue路由 详解(八)vue路由守卫
		完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 13.vue路由守卫 a.beforeEach 全局守卫 (每个路由调用前都会触发,根据 ... 
- react用高阶组件实现路由守卫
		react-router不像vue-router一样有很多钩子函数,可以做路由守卫.想实现路由守卫,可以用高阶组件来实现. @connect(state => ({ isLogin: state ... 
- vue2.0 实现导航守卫(路由守卫)
		路由跳转前做一些验证,比如登录验证,是网站中的普遍需求. 对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards). 导航守卫 ... 
- vue路由守卫应用,监听是否登录
		路由跳转前做一些验证,比如登录验证,是网站中的普遍需求. 对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards). 导航守卫 ... 
- vue-router钩子函数实现路由守卫
		接上一篇,我们一起学习了vue路由的基本使用以及动态路由.路由嵌套以及路由命名等知识,今天我们一起来学习记录vue-router的钩子函数实现路由守卫: 何为路由守卫?路由守卫有点类似于ajax的请求 ... 
随机推荐
- Master的注册机制和状态改变管理解密
			本课主题 Master 接收 Worker, Driver, Application 注册 Master 处理 Driver 狀态变换 Master 处理 Executor 狀态变换 Master 接 ... 
- python数据结构(整理)
			http://www.cnblogs.com/yupeng/p/3413763.html 1. 单链表 链表的定义: 链表(linked list)是由一组被称为结点的数据元素组成的数据结构,每个结点 ... 
- css 17课--
			---------------------------------------------------------------------------------------------------- ... 
- Nginx卸载重装问题
			1.删除nginx,-purge包括配置文件 sudo apt-get --purge remove nginx 2.移除全部不使用的软件包 sudo apt-get autoremove 3 ... 
- C++、Java、Objective-C、Swift 二进制兼容测试
			鉴于目前动态库在iOS App中使用越来越广泛,二进制的兼容问题可能会成为一个令人头疼的问题.本文主要对比一下C++.Java.Objecive-C和Swift的二进制兼容问题. iOS端动态库使用情 ... 
- 牛客网多校训练第一场 B - Symmetric Matrix(dp)
			链接: https://www.nowcoder.com/acm/contest/139/B 题意: 求满足以下条件的n*n矩阵A的数量模m:A(i,j) ∈ {0,1,2}, 1≤i,j≤n.A(i ... 
- UVa 12265 - Selling Land
			链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ... 
- BZOJ2346:[Baltic 2011]Lamp(最短路)
			Description 2255是一个傻X,他连自己家灯不亮了都不知道. 某天TZ大神路过他家,发现了这一情况, 于是TZ开始行侠仗义了. TZ发现是电路板的问题, 他打开了电路板,发现线路根本没有连 ... 
- 转:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 解决方案
			转:javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 解决方案javax.net.ssl.SSL ... 
- Objective-C中的@dynamic与@synthesize的区别
			Objective-C中的@dynamic 转自:http://blog.csdn.net/haishu_zheng/article/details/12873151 一.@dynamic与@synt ... 
