react-router-dom实现全局路由登陆拦截
相比与vue的路由集中式管理,能够很好的进行统一的路由操作,react的路由看起来更乱,想要进行像vue的全局路由管理不是那么得心应手。在我们的项目中,有很多页面是需要登陆权限验证的,最好的方式就是能够统一管理,而不是每个页面都要单独处理,下面是我的实现方法:
首先我们建一个文件routerMap.js用来存储所有的路由信息,定义需要登陆拦截的页面(auth):
//routerMap.js import Index from '../containers';
import Detail from '../containers/detail';
import Home from '../containers/home';
import List from '../containers/list';
import Topics from '../containers/topics';
import Parents from '../containers/passValue/parents';
import Children from '../containers/passValue/children';
import Request from '../containers/ajax';
import Like from '../containers/like';
import PopModule from '../containers/popModule/popModule';
import Reduxs from '../containers/redux/redux';
import Login from '../containers/login/login';
import Workers from '../containers/worker/worker';
import IndexedDB from '../containers/indexedDB/indexedDB'; export default [
{ path: "/", name: "App", component: Index },
{ path: "/home", name: "Home", component: Home },
{ path: "/topics", name: "Topics", component: Topics },
{ path: "/detail/:id", name: "Detail", component: Detail },
{ path: "/list", name: "List", component: List },
{ path: "/parents", name: "Parents", component: Parents },
{ path: "/children", name: "Children", component: Children },
{ path: "/ajax", name: "Request", component: Request, auth: true },
{ path: "/like", name: "Like", component: Like, auth: true },
{ path: "/popModule", name: "PopModule", component: PopModule, auth: true },
{ path: "/redux", name: "Reduxs", component: Reduxs, auth: true },
{ path: "/login", name: "Login", component: Login },
{ path: "/worker", name: "Worker", component: Workers },
{ path: "/indexedDB", name: "indexedDB", component: IndexedDB }
]
然后在App.js里面引入:
//App.js
import React from 'react';
import {
BrowserRouter as Router,
Route,
Switch,
Redirect
} from 'react-router-dom';
import { connect } from 'react-redux'
import Routers from './router/routerMap' // 公共头部组件
import Header from './common/header'
// 404页面
import NotFound from './containers/notFound' class App extends React.Component {
constructor(props) {
super(props)
}
render() {
let token = this.props.token
return (
<Router>
<div>
<Header />
<Switch>
{Routers.map((item, index) => {
return <Route key={index} path={item.path} exact render={props =>
(!item.auth ? (<item.component {...props} />) : (token ? <item.component {...props} /> : <Redirect to={{
pathname: '/login',
state: { from: props.location }
}} />)
)} />
})}
// 所有错误路由跳转页面
<Route component={NotFound} />
</Switch>
</div>
</Router>
)
}
} // redux拿到token并挂载到App的props上面
const mapStateToProps = (state, ownProps) => {
return { token: state.token }
} export default connect(mapStateToProps)(App)
以上代码最重要的点是Route组建里面用render属性替换component来渲染页面,根据routerMap.js中的每一条路由信息中的auth(自定义)字段来区分是否需要进行登陆拦截,再根据redux里面的token字段来判断是不是登陆状态,然后进行相关的操作。如果已经拦截了就把当前的路由通过Redirect的state来传递到登陆页面,在登陆页面打印this.props来看控制台的输出:

以上红框内的信息即为重定向之前的页面信息,如果登陆成功之后回跳from.pathname即可:
// 登陆成功方法 login.jsx
setToken() {
let token = this.state.user + this.state.pwd
if (!token) return
let RedirectUrl = this.props.location.state ? this.props.location.state.from.pathname : '/'
// 修改redux中的token值
this.props.changeActive(token)
// 登陆成功之后的跳转
this.props.history.push(RedirectUrl)
}
react全局的登陆拦截方法到此就完成了
react-router-dom实现全局路由登陆拦截的更多相关文章
- react router @4 和 vue路由 详解(全)
react router @4 和 vue路由 本文大纲: 1.vue路由基础和使用 2.react-router @4用法 3.什么是包容性路由?什么是排他性路由? 4.react路由有两个重要的属 ...
- React Router 4.0 实现路由守卫
在使用 Vue 或者 Angular 的时候,框架提供了路由守卫功能,用来在进入某个路有前进行一些校验工作,如果校验失败,就跳转到 404 或者登陆页面,比如 Vue 中的 beforeEnter 函 ...
- react router @4 和 vue路由 详解(七)react路由守卫
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 12.react路由守卫? a.在之前的版本中,React Router 也提供了类似的 ...
- react router @4 和 vue路由 详解(八)vue路由守卫
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 13.vue路由守卫 a.beforeEach 全局守卫 (每个路由调用前都会触发,根据 ...
- React Router 4.0 ---- 嵌套路由和动态路由
嵌套路由,从广义上来说,分为两种情况:一种是每个路由到的组件都有共有的内容,这时把共有的内容抽离成一个组件,变化的内容也是一个组件,两种组件组合嵌套,形成一个新的组件.另一种是子路由,路由到的组件内部 ...
- react router @4 和 vue路由 详解(六)vue怎么通过路由传参?
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 8.vue怎么通过路由传参? a.通配符传参数 //在定义路由的时候 { path: ' ...
- react router @4 和 vue路由 详解(五)react怎么通过路由传参
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 7.react怎么通过路由传参? a.通配符传参(刷新页面数据不丢失) //在定义路由的 ...
- react router @4 和 vue路由 详解(四)vue如何在路由里面定义一个子路由
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 6.vue如何在路由里面定义一个子路由? 给父路由加一个 children:[] 参考我 ...
- react router @4 和 vue路由 详解(三)react如何在路由里面定义一个子路由
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 5.react如何在路由里面定义一个子路由? a.引入在需要子路由的页面引入Rout ...
随机推荐
- Mysql 启动失败常见错误
各位可以按照顺序逐条拍错. mysql启动时报错:Starting MySQL... ERROR! The server quit without updating PID file (/opt/my ...
- mac crontab
1.前提工作 正常情况下mac普通用户是无法使用crontab的,需要做如下修改: 在~/.vimrc下添加这么一行: autocmd filetype crontab setlocal noback ...
- Tomcat启动阻塞变慢
Tomcat 熵池阻塞变慢详解 Tomcat 启动很慢,且日志上无任何错误,在日志中查看到如下信息: Log4j:[2015-10-29 15:47:11] INFO ReadProperty:172 ...
- flume 1.4 设置FLUME_CONF_DIR没用
今天安装Apache Flume 1.4的时候,发现设置了FLUME_CONF_DIR环境变量和flume-env.sh后,运行flume-ng时flume-env.sh中的JAVA_HOME没有生效 ...
- call/apply
call与apply都可以改变this指向,但是传参列表不同. call 任何一种方法都可以.call,借用别人函数,自己用. call只需把实参按照形参的个数传进去,apply只能传一个argume ...
- c++新标准的一个问题
显示转换运算符存在多个兼容版本的时候,explicit 关键字无效,编译器默认会选择那个兼容版本进行转换,而不是报错. 测试环境:gcc4.8.1 示例代码: class plebe { privat ...
- Android(java)学习笔记209:Android线程形态之 HandlerThread
1. HandlerThread Android HandlerThread 完全解析 Handler与HandlerThread区别,HandlerThread应用(对比AsyncTask) 备注 ...
- Android(java)学习笔记1:多线程的引入
1. 多线程的引入:
- 使用JQuery做一组复选框的功能。
之前做过复选框的功能,奈何笔记丢失,害的我又鼓捣了一番...还是博客园做笔记比较好. 假设现在有一个表格,每一行都有一个复选框按钮.在表头还有一个全选的复选框按钮. ①.当点击一个全选按钮时,下面的同 ...
- App上线流程全攻略(史上最具体步骤)
@转载请保留:iOS界一迷糊小书童--->专注于iOS开发!!谢谢合作 /*****************************************1****************** ...