完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html

12、react路由守卫?

  a、在之前的版本中,React Router 也提供了类似的 onEnter 钩子,但在 React Router 4.0 版本中,取消了这个方法。

  b、那么在react中如果我们也需要路由守卫怎么办?比如在跳转路由前需要判断用户是否登录?如果登录才可以进行跳转,否则没有权限

  c、

//下面是我的实现方式,
//首先,准备一份路由表,
//包含了路由的地址,组件以及是否需要权限校验: import { HomePage } from '../pages/home/home.page';
import { LoginPage } from '../pages/login/login.page';
import { ErrorPage } from '../pages/error/error.page'; interface routerConfigModel {
path:string,
component?:any,
auth?:boolean
} export const routerConfig:routerConfigModel[] = [
{
path:'/',
component:HomePage,
auth:true,
},
{
path:'/home',
component:HomePage,
auth:true,
},
{
path:'/login',
component:LoginPage,
},
{
path:'/404',
component:ErrorPage
}
]; //将 auth 设置为 true,表示该路由需要权限校验。
//然后,定义 Router 组件,该组件是经过高阶组件包装后的结果: import * as React from 'react';
import { HashRouter,Switch } from 'react-router-dom';
import { FrontendAuth } from '../components/frontend-auth/frontend-auth.component'
import { routerConfig } from './router.config' export class Router extends React.Component{
render(){
return(
<HashRouter>
<Switch>
<FrontendAuth config={routerConfig} />
</Switch>
</HashRouter>
);
}
} //所有的路由跳转,都交给 FrontendAuth 高阶组件代理完成。
//下面是 FrontendAuth 组件的实现: import * as React from 'react';
import { Route,Redirect } from 'react-router-dom';
import { propsModel } from './frontend-auth.model' export class FrontendAuth extends React.Component<any,propsModel>{
render(){
const { location,config } = this.props;
const { pathname } = location;
const isLogin = localStorage.getItem('__config_center_token') // 如果该路由不用进行权限校验,登录状态下登陆页除外
// 因为登陆后,无法跳转到登陆页
// 这部分代码,是为了在非登陆状态下,访问不需要权限校验的路由 const targetRouterConfig = config.find((v:any) => v.path === pathname);
if(targetRouterConfig && !targetRouterConfig.auth && !isLogin){
const { component } = targetRouterConfig;
return <Route exact path={pathname} component={component} />
} if(isLogin){
// 如果是登陆状态,想要跳转到登陆,重定向到主页
if(pathname === '/login'){
return <Redirect to='/' />
}else{
// 如果路由合法,就跳转到相应的路由
if(targetRouterConfig){
return <Route path={pathname} component={targetRouterConfig.component} />
}else{
// 如果路由不合法,重定向到 404 页面
return <Redirect to='/404' />
}
}
}else{
// 非登陆状态下,当路由合法时且需要权限校验时,跳转到登陆页面,要求登陆
if(targetRouterConfig && targetRouterConfig.auth){
return <Redirect to='/login' />
}else{
// 非登陆状态下,路由不合法时,重定向至 404
return <Redirect to='/404' />
}
}
}
} //以及对应的 Model: export interface propsModel {
config:any[],
} //页面上的路由跳转,都由 FrontendAuth 高阶组件代理了,
//在 Switch 组件内部,不再是 Route 组件,
//而只有一个 FrontendAuth 组件。 //FrontendAuth 组件接收一个名为 config 的 Props,这是一份路由表。
//同时,由于 FrontendAuth 组件放在了 Switch 组件内部,React Router 还自动为 FrontendAuth 注入了 location 属性,
//当地址栏的路由发生变化时,就会触发 location 属性对象上的 pathname 属性发生变化,
//从而触发 FrontendAuth 的更新(调用 render 函数)。 //FrontendAuth 的 render 函数中,
//根据 pathname 查找到路由表中的相关配置,
//如果该配置中指定了无需校验,就直接返回相应的 Route 组件。
//如果查找到的配置需要进行校验,再根据是否登陆进行处理,具体可以查看代码中的注释。 总结一下,实现路由守卫需要考虑到以下的问题: 未登录情况下,访问不需要权限校验的合法页面:允许访问
登陆情况下,访问登陆页面:禁止访问,跳转至主页
登陆情况下,访问除登陆页以外的合法页面:允许访问
登陆情况下,访问所有的非法页面:禁止访问,跳转至 404
未登录情况下,访问需要权限校验的页面:禁止访问,跳转至登陆页
未登录情况下,访问所有的非法页面:禁止访问,跳转至 404

react router @4 和 vue路由 详解(七)react路由守卫的更多相关文章

  1. react router @4 和 vue路由 详解(三)react如何在路由里面定义一个子路由

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 5.react如何在路由里面定义一个子路由?   a.引入在需要子路由的页面引入Rout ...

  2. react router @4 和 vue路由 详解(五)react怎么通过路由传参

    完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 7.react怎么通过路由传参? a.通配符传参(刷新页面数据不丢失) //在定义路由的 ...

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

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

  4. angular路由详解三(路由参数传递)

    我们经常用路由传递参数,路由主要有三种方式: 第一种:在查询参数中传递数据 {path:"address/:id"}   => address/1  => Activa ...

  5. react router @4 和 vue路由 详解(全)

    react router @4 和 vue路由 本文大纲: 1.vue路由基础和使用 2.react-router @4用法 3.什么是包容性路由?什么是排他性路由? 4.react路由有两个重要的属 ...

  6. Vue 路由详解

    Vue 路由详解 对于前端来说,其实浏览器配合超级连接就很好的实现了路由功能.但是对于单页面应用来说,浏览器和超级连接的跳转方式已经不能适用,所以各大框架纷纷给出了单页面应用的解决路由跳转的方案. V ...

  7. vue技术栈进阶(02.路由详解—基础)

    路由详解(一)--基础: 1)router-link和router-view组件 2)路由配置 3)JS操作路由

  8. Ocelot简易教程(三)之主要特性及路由详解

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9664977.html 上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个 ...

  9. elasticsearch系列三:索引详解(分词器、文档管理、路由详解(集群))

    一.分词器 1. 认识分词器  1.1 Analyzer   分析器 在ES中一个Analyzer 由下面三种组件组合而成: character filter :字符过滤器,对文本进行字符过滤处理,如 ...

随机推荐

  1. Django安装与创建项目

    下载 https://media.djangoproject.com/releases/1.11/Django-1.11.20.tar.gz 解压 tar -zvxf Django-1.11.20.t ...

  2. Servlet快速入门

    servlet是运行在服务端的java小程序,用来处理客户端请求,响应给浏览器的动态资源 servlet规范:包含3个技术点 1.servlet技术 2.filter技术 3.listener技术 s ...

  3. ArrayList list = new ArrayList()在这个泛型为Integer的ArrayList中存放一个String类型的对象

    java面试要点---ArrayList list = new ArrayList(); 在这个泛型为Integer的ArrayList中存放一个String类型的对象. ArrayList list ...

  4. cocos2dx lua 绑定之一:自动绑定自定义类中的函数

    cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注 ...

  5. Unity --- sharedMaterial 、material

    sharedMaterial: 无论如何更新材质的属性,内存中只会存在一份. material: 每次更新材质属性的时候,内存中都会重新new一份material作用于它,直到 Application ...

  6. 数据结构(C语言版)-第6章 图

    6.1 图的定义和基本术语 图:Graph=(V,E)  V:顶点(数据元素)的有穷非空集合:  E:边的有穷集合. 无向图:每条边都是无方向的 有向图:每条边都是有方向的 完全图:任意两个点都有一条 ...

  7. word中的交叉引用

    分别使用“交叉引用”依次插入所需应用文献编号范围的第一个和最后一个. 所需引用处出现“[1][3]”   在引用处对两个编号操作:点击鼠标右键-选择“切换域代码”. [1]变为” {REF _Ref4 ...

  8. java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration

    java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration 最近在做项目的时候遇到了这个问题,很是困扰,多次尝试后发现是jar包的问 ...

  9. org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1428942566812653608

    一.异常信息 org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet reque ...

  10. hdu-3001 三进制状态压缩+dp

    用dp来求最短路,虽然效率低,但是状态的概念方便解决最短路问题中的很多限制,也便于压缩以保存更多信息. 本题要求访问全图,且每个节点不能访问两次以上.所以用一个三进制数保存全图的访问状态(3^10,空 ...