react没有vue那样的路由钩子beforeEach,实现登陆验证。

实现效果:如果没有登陆,就跳转到登陆界面,如果登陆过浏览器存有登陆信息就跳转到所输入的路由界面,如果该路由不存在则跳到404页面。

router文件夹下新建index.jsx和auth.jsx

index.jsx  把页面导入进来,配置路由,传入到auth中,auth遍历所有路由。

import React, { Component } from 'react';
import {HashRouter as Router, Switch } from 'react-router-dom'
import Auth from './auth'
import Home from '../pages/Home'
import Login from '../pages/Login'
import NotFound from '../pages/NotFound' export default class RouterMap extends React.Component {
constructor(props,context){
super(props,context)
} render() {
const routerConfig = [
{path:'/',component:Home,auth:true},
{path:'/home',component:Home,auth:true},
{path:'/login',component:Login},
{path:'/404',component:NotFound}
];
return (
<Router history={this.props.history}>
<Switch>
<Auth config={routerConfig} />
</Switch>
</Router>
)
} }

auth.jsx

import React, { Component } from 'react';
import { Route, Redirect } from 'react-router-dom'
import App from '../pages/App'
import Login from '../pages/Login'
import NotFound from '../pages/NotFound' export default class Auth extends React.Component{
render(){
const { location,config } = this.props;
const { pathname } = location;
const isLogin = localStorage.getItem('USERINFO')
// console.log(isLogin);
// console.log(store.getState());
// 这部分代码,是为了在非登陆状态下,访问不需要权限校验的路由
const targetRouterConfig = config.find((v) => v.path === pathname);
if(targetRouterConfig && !targetRouterConfig.auth && !isLogin){
const { component } = targetRouterConfig;
return <Route exact path={pathname} component={component} />
} if(isLogin){
// 如果是登陆状态,想要跳转到登陆
if(pathname === '/login'){
return <Route exact path='/login' component={Login}/>
}else{
// 如果路由合法,就跳转到相应的路由
if(targetRouterConfig&&pathname!=='/404'){ //这里用app包裹组件是因为app里有除登录页和404页的其他页面公用的头部组件和侧边菜单组件
return <App><Route path={pathname} component={targetRouterConfig.component} /></App>
}else if(pathname === '/404'){
return <Route exact path='/404' component={NotFound}/>
}else{
// 如果路由不合法,重定向到 404 页面
return <Redirect to='/404' />
}
}
}else{
// 非登陆状态下,重定向到登陆页
return <Redirect to='/login' />
}
}
}

App.jsx 父组件

import React, { Component } from 'react';
import {connect} from 'react-redux'
import {bindActionCreators} from 'redux'
import Header from '../components/header/index'
import Menu from '../components/menu/index'
import * as userinfoActions from '../store/userinfo/action' class App extends React.Component { render() {
return (
<div className="App">
<Header title="NINGMENG 后台管理系统" username={this.props.userInfo.username}/> // 这个是头部公用组件
<Menu /> // 侧栏菜单公用组件
{this.props.children}
</div>
)
}
componentDidMount() {
let userInfo = JSON.parse(localStorage.getItem('USERINFO'))
this.props.userInfoActions.saveUserInfo(userInfo) // 在登陆页面的时候如果登陆成功就把登陆信息存到localStorage里面,跳到首页之后把用户信息存到redux
}
}

// 下面的是redux的写法
function mapStateToProps(state){
return {
userInfo: state.userInfo
}
} function mapDispatchToProps(dispatch){
return {
userInfoActions: bindActionCreators(userinfoActions, dispatch)
}
} export default connect(
mapStateToProps,
mapDispatchToProps
)(App)

更多代码见 https://github.com/leitingting08/react-app

react路由守卫的更多相关文章

  1. react router @4 和 vue路由 详解(七)react路由守卫

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 12.react路由守卫? a.在之前的版本中,React Router 也提供了类似的 ...

  2. react前置路由守卫

    react中一切皆组件-- 目标:自定义user界面的前置路由守卫,当用户点击要进入user组件时,路由守卫发起判断,如果条件满足则进入,否则跳转至login组件. .入口文件index.js中代码如 ...

  3. React Router 4.0 实现路由守卫

    在使用 Vue 或者 Angular 的时候,框架提供了路由守卫功能,用来在进入某个路有前进行一些校验工作,如果校验失败,就跳转到 404 或者登陆页面,比如 Vue 中的 beforeEnter 函 ...

  4. react router @4 和 vue路由 详解(八)vue路由守卫

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 13.vue路由守卫 a.beforeEach 全局守卫 (每个路由调用前都会触发,根据 ...

  5. react用高阶组件实现路由守卫

    react-router不像vue-router一样有很多钩子函数,可以做路由守卫.想实现路由守卫,可以用高阶组件来实现. @connect(state => ({ isLogin: state ...

  6. angular4.0 路由守卫详解

    在企业应用中权限.复杂页多路由数据处理.进入与离开路由数据处理这些是非常常见的需求. 当希望用户离开一个正常编辑页时,要中断并提醒用户是否真的要离开时,如果在Angular中应该怎么做呢? 其实Ang ...

  7. vue2.0 实现导航守卫(路由守卫)

    路由跳转前做一些验证,比如登录验证,是网站中的普遍需求. 对此,vue-route 提供的 beforeRouteUpdate 可以方便地实现导航守卫(navigation-guards). 导航守卫 ...

  8. angular路由详解六(路由守卫)

    路由守卫 CanActivate: 处理导航到某个路由的情况. CanDeactivate:处理从当前路由离开的情况. Resole:在路由激活之前获取路由数据. 1.CanActivate: 处理导 ...

  9. angular路由守卫

     路由守卫是指当用户满足了某些要求之后才可以离开或者进入某个页面或者场景的时候使用.比如说只有当用户填写了用户名和密码之后才可以进入首页,比如说用户离开某个页面时明月保存信息提示用户是否保存信息后再离 ...

随机推荐

  1. 分享10个原生JavaScript技巧

    首先在这里要非常感谢无私分享作品的网友们,这些代码片段主要由网友们平时分享的作品代码里面和经常去逛网站然后查看源文件收集到的.把平时网站上常用的一些实用功能代码片段通通收集起来,方便网友们学习使用,利 ...

  2. 关于Cocos2d-x中节点和精灵的关系以及初始化

    1.每一个对象类都有一个自己public的一个create函数(等价于CREATE_FUNC),和init函数. 2.create函数返回的是自身的类型,init函数是在ceate函数被调用的时候自动 ...

  3. tensorflow函数学习笔记

    https://www.w3cschool.cn/tensorflow_python/tensorflow_python-4isv2ez3.html tf.trainable_variables返回的 ...

  4. [转] C# mysql 事务回滚

    什么是数据库事务 数据库事务是指作为单个逻辑工作单元执行的一系列操作. 设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作: · 更新客户所购商品的库存信息 · 保存客户付款信息--可能包括 ...

  5. DOM编程 学习笔记(一)

    PS:虽然自己JS基本语法算是掌握了,但是其实在JS掌握的只是远远还不够,网页上有太多好看的动态效果都是用JS 做出来的,自己也就仅仅会那么一两个动态的效果,学的只是皮毛...等有空的时候一定要好好的 ...

  6. javascript -- 判断是否为某个数据类型

    为何不用其他方法,因为下面的写法考虑了各种兼容性.判断是否为数组isArray = function (source) {    return '[object Array]' == Object.p ...

  7. BWT转换对字符串进行编码

    今天看了下bowtie 的论文, 里面描述了BWT转换的过程和bowtie的比对算法: NGS测序数据的数据量非常大, 为了更快的处理, 通常需要对数据进行压缩:而BWT实际上就是一种数据转换方法, ...

  8. Unity3D-光照贴图技术

    概念 Lightmapping光照贴图技术是一种增强静态场景光照效果的技术,其优点是可以通过较少的性能消耗使静态场景看上去更加真实,丰富,更加具有立体感:缺点是不能用来实时地处理动态光照.当游戏场景包 ...

  9. Kubernetes(一)初探

    Kubernetes是Google开源的容器集群管理系统.它构建于docker技术之上,为容器化的应用提供资源调度.部署运行.服务发现.扩容缩容等整一套功能,本质上可看作是基于容器技术的mini-Pa ...

  10. Java几款性能分析工具的对比

    在给客户的应用程序维护的过程中,我注意到在高负载下的一些性能问题.理论上,增加对应用程序的负载会使性能等比率的下降.然而,我认为性能下降的比率远远高于负载的增加.我也发现,性能可以通过改变应用程序的逻 ...