距离上一篇文章,似乎已经过去好久了。

  确实是最近相对忙了一点,本身是用vue重构之前一个传统的项目,就自己一个人写。而且,在稍微闲暇之余,想着同时用react也重构一遍,也算是对react的学习吧!毕竟只有实际应用才是最好的学习方法。

  在vue应用中,我们常常涉及到一个概念就是路由导航守卫。

  在做用户登录确认和身份标识时,常常需要进行路由的导航守卫。

  当前的项目需求:

    用户如果想要使用我们的平台,必须进行登录,用户登录之后,依据用户身份,确认其是车主,还是货主,分别展示不同的应用内容。

    所以路由导航守卫的大概是这样的:

      在用户输入应用网址之后,先检测是否登录,如果未登录,二次跳转到登录页面,如果已经登录,那么判断用户身份,如果车主,跳转到车主对应的页面,如果是货主,跳转到货主对应的页面。

  vue应用中,我们配置完路由之后,统一对路由进行守卫,直接上代码吧!

router.beforeEach((to, from, next) => {
NProgress.start()
let identity = parseInt(localStorage.getItem('identity'), 10)
if (whiteList.indexOf(to.path) !== -1) {
next()
} else {
if (identity) {
identity = identity === 2 ? 'shipper' : identity === 1 ? 'carrier' : ''
// console.log('permission:', to.path, to.path.includes(identity))
if (to.path.includes(identity)) {
next()
} else {
next({
name: identity,
replace: true
})
}
} else {
next(`/login?redirect=${ to.path }`)
NProgress.done()
}
}
}) router.afterEach((to, from) => {
if (whiteList.indexOf(to.path) !== -1) {
store.dispatch('fedLogOut')
let identity = localStorage.getItem('identity')
if (identity) localStorage.setItem('identity', null)
}
// finish progress bar
NProgress.done()
})

  在router.beforeEach中,第一个if判断的是,如果当前用户直接输入的是类似于login、registe这些页面,在直接利用next()跳转到用户输入的页面。

  第二个if (identity)判断的是用户是否已经登录了,如果不存在identity,也就是用户未登录,利用next(`/login?redirect=${ to.path }`)跳转到login页面。

  第三个if (to.path.includes(identity))判断的是用户输入的网址和其身份标识是否匹配,如果是车主,输入的网址是属于货主的,就重定向到车主所属页面。

  这一整个流程下来,就完成了路由的导航守卫。

  然而,当使用react进行重构的时候,发现一个尴尬的事情,react应用中,react-router4似乎并没有提供上述类似的api供我们进行路由守卫,然而路由的导航守卫又必须要做,总不至于刚刚开始项目就这么夭折吧!这其中寻找react-router4的导航守卫过程,就不细说了,说多了都是泪啊。只说结果:react-router4就是以组件的方式提供的导航,他所有的类似于<Route/> <Link/>等等,都是组件。然后,想到什么了?

  来吧!

  当然:(路由怎么配置就不说了)与之前一样,类似于login、register的页面不需要任何守卫,直接进入就好了。需要守卫的是当用户进入车主和货主的页面时。

  上代码吧!

const { isLogined, identity } = this.state
return isLogined ?
(identity === 2 ?
(<Spin spinning={this.props.loading}><Layout>
<Header className="header">
<div className="enterprise">南京星通北斗哦</div>
<Navbar />
<UserInfo className="userinfo" />
</Header>
<Content className="container">
<Switch>
{
Shippers.map(route => {
return <Route path={"/shipper/" + route.path} component={route.component} key={route.path} />
})
}
<Route path={"/" || "/shipper/*"} render={() => (
<Redirect to="/shipper/home" />
)} />
</Switch>
</Content>
</Layout></Spin>) :
<Redirect to="/carrier" />) :
<Redirect to="/login" />

  看出什么了?两个关键词:isLogined、identity(代码并不全,主要说的是思路,请勿直接使用)。

  isLogined判断的是是否登录,如果未登陆,<Redirect to="/login" />

  identity === 2判断的是当前是否为货主,如果不是,<Redirect to="/carrier" />

  只有这两个判断都满足了,才能展示当前货主所属的组件,是不是完成了所谓的路由导航守卫?

  需要改变的是一个思想:react-router4当中,他就是组件,不满足条件的话,直接Redirect,这就是所谓的导航守卫。思想转变过来了,其实要做react-router4似乎比vue-router的导航守卫更简单一点呢!

在react项目当中做导航守卫的更多相关文章

  1. 在react项目当中使用redux

    如果需要在你的react项目当中使用状态管理模式的话,需要引入redux和react-redux两个插件,redux提供基本的功能,react-redux提供将redux注入react的方法. imp ...

  2. 如何在非 React 项目中使用 Redux

    本文作者:胡子大哈 原文链接:https://scriptoj.com/topic/178/如何在非-react-项目中使用-redux 转载请注明出处,保留原文链接和作者信息. 目录 1.前言 2. ...

  3. vue-router导航守卫(router.beforeEach())的使用

    好久没写一些东西了,总是感觉有啥缺少的.~~~~恰好碰到最近在写一个移动端项目,遇到了如何使同一个链接在不同条件下跳转到不同路由组件问题,譬如大家经常看到手机中没登录跳转登录页,登陆后跳转个人信息页等 ...

  4. VueJs(12)---vue-router(导航守卫,路由元信息)

    vue-router(导航守卫,路由元信息) 之前泄露两篇有关vue-router博客: VueJs(10)---vue-router(进阶1) VueJs(11)---vue-router(进阶2) ...

  5. Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子]

    前言 说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子(created,mounted),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比 ...

  6. vue-router导航守卫,限制页面访问权限

    在项目开发过程中,经常会需要登录.注册.忘记密码等,也有很多页面是需要登录后才能访问,有些页面是无需登录就可以访问的,那么vue是怎么来限制这些访问权限问题的呢? vue-router导航守卫的bef ...

  7. react项目开发中遇到的问题

    前言 作为一个前端爱好者来说,都想在react上一试生手,那么在搭建react项目开发时,肯定会有这样或者那样的问题,尤其是对初学者来说,下面就个人在开发过程中遇到的问题总结一下,好在有google帮 ...

  8. Vue(7)- vue-cookies、极验滑动验证geetest、vue-router的导航守卫

    一.vue-cookies 参考文档简书:https://www.jianshu.com/p/535b53989b39 参考文档npm:https://www.npmjs.com/package/vu ...

  9. vue-cookies、极验滑动验证geetest、vue-router的导航守卫

    一 . vue-cookies 参考文档简书:https://www.jianshu.com/p/535b53989b39 参考文档npm:https://www.npmjs.com/package/ ...

随机推荐

  1. JAVA之G1与CMS垃圾回收

    G1 GC,全称Garbage-FirstGarbage Collector,通过-XX:+UseG1GC参数来启用,作为体验版随着JDK 6u14版本面世,在JDK 7u4版本发行时被正式推出,相信 ...

  2. 2个最好的JavaScript编辑器 必须要知道

    JavaScript程序员有许多很好的工具可供选择,几乎太多了.在这篇文章中,介绍2个最好用的文本编辑器,也是顶级的.并且很好地支持使用JavaScript,HTML5和CSS进行开发,并用Markd ...

  3. SpringMVC支持跨域请求

    一.如果项目中使用的SpringMVC4.3.9以下,就需要对该请求配置Filter,设置请求头可支持跨域.使用方法: --spring cloud zuul支持跨域---:https://blog. ...

  4. laravel-5.6路由命名

    1.第一种:通过route路由中的as关键字来实现 1 Route::get('api/user',['as'='web.user'],'messageController@userInformati ...

  5. 移动端——link标签

    meta标签中提到了部分功能要结合link标签进行使用,link标签主要是存放CSS文件的地方,同时还有一些专属的移动端设置. <meta http-equiv="Content-Ty ...

  6. 图解Python 【第一篇】:Python基础1

    本节内容一览图 一.Python简介  Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间, ...

  7. cat中文正常vi中文乱码

    Linux cat中文正常vi中文乱码 问题示例 出现此问题,有可能是vim 编辑器的配置编码方面的问题. 出现此情况,在vim 编辑器中输入 :e ++enc=utf8 :e ++enc=zh_CN ...

  8. visible,invisible和GONE的区别

    在Android开发中,大部分控件都有visibility这个属性,其属性有3个分别为“visible ”.“invisible”.“gone”.主要用来设置控制控件的显示和隐藏.有些人可能会疑惑In ...

  9. 图解Go协程调度原理,小白都能理解

    阅读本文仅需五分钟,golang协程调度原理,小白也能看懂,超实用. 什么是协程 对于进程.线程,都是有内核进行调度,有CPU时间片的概念,进行抢占式调度.协程,又称微线程,纤程.英文名Corouti ...

  10. $nextTick的使用

    原文地址 概览 官方文档说明: 用法: 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 疑问: DOM 更新循环是指什么? 下次更新循环是什么时候 ...