umi权限路由_Umi 小白纪实(三)—— 震惊!路由竟然如此强大!

在《Umi 小白纪实(一)》中有提到过简单的路由配置和使用,但这只是冰山一角

借用一句广告词,Umi 路由的能量,超乎你的想象

一、基本用法

Umi 的路由根结点是全局 layout  src/layouts/index.js

路由会将相应的页面组件映射到上面的 props.children 中

之前的文章介绍过,Umi 的路由可以通过.umirc.js文件中的 routes 字段配置

但配置 routes 字段后,约定式路由不会生效。如果项目较重,就需要配置很多路由,所以我更倾向于使用约定式路由

Umi 可以基于 pages 目录下的结构,自动生成路由配置,这就是约定式路由

比如上图的目录结构,最终会被 Umi 解析为

[

{ path:'/', component: './pages/index.jsx'},

{ path:'/users/', component: './pages/user/index.jsx'},

{ path:'/users/list', component: './pages/user/detail/index.jsx'},

]

二、动态路由

假如有某一个表单页,需要区分新增(add)和编辑(edit)两种状态,这时候就可以采用动态路由

umi 里约定,带 $ 前缀的目录或文件为动态路由

然后在对应的组件中,通过props.match.params来获取路由中的动态参数

再来一个需求:假如有一个 tab 菜单页,进入该页面时可以指定某个菜单,如果没有指定则展示第一个菜单

这时候就可以使用可选的动态路由,umi 里约定带 $ 后缀的动态路由为可选动态路由

然后同样通过props.match.params 来获取动态参数

这样访问 /user/:id/list 和 /user/list 都能访问到该页面

三、嵌套路由

umi 约定目录下有 _layout.js 时会生成嵌套路由,以_layout.js 为该路由的根结点

如上图的结构,在访问 /user/detail/count/ 和 /user/detail/info/ 的时候都会以 _layout.js 生成二级路由

但在切换子路由,当前的滚动条并不会变化,如果希望切换子组件之后回到顶部,可以在 _layout.js 的 componentDidUpdate 中添加相应的逻辑

componentDidUpdate(prevProps) {if (this.props.location !==prevProps.location) {

window.scrollTo(0, 0);

}

}

PS: _layout.js 也可以是 _layout.jsx,上面的全局 layout 同理

四、通过 yaml 注释扩展路由

以上其实都是一些基本的路由功能,虽然以约定目录的方式实现了这么完善的路由功能还是很令人赞叹,但还称不上“震惊”二字

真正让我佩服到五体投地的东西,从这里开始...

约定式路由虽然能节省冗杂的路由配置,但也不如直接配置routes来的灵活

Umi 的解决方案是,通过 yaml 注释来扩展约定式路由的功能

Umi 约定路由文件的首个注释如果包含 yaml 格式的配置,则会被用于扩展路由

比如修改页面的 title,可以直接通过添加 yaml 注释搞定

所有 routes 字段可以配置的参数,都可以通过注释来扩展

这个功能为完善路由组件的功能提供了基础,比如权限路由

如果项目需要校验权限,比如用户是否登录,只需在需要校验权限的组件顶部添加注释

/**

* Routes:

* - ./src/routes/private.jsx*/

这样一来,当前组件就会作为子组件嵌套在 private.jsx 中

然后在 private.jsx 中添加校验权限的逻辑

五、基于路由的按需加载

约定式路由结合注释之后,就会生成完整的路由配置,可以在页面组件上通过props.route.routes获取到

再结合其它插件就可以实现面包屑、切换动效等,这些就功能不展开说了。

但 Umi 还在看不见的地方,利用路由做了很多优化,比如按需加载

//.umirc.js

export default{

plugins: [

['umi-plugin-react', {

dynamicImport:true,

}],

],

};

对于开发人员来说,只需要添加以上配置就能开启按需加载

开启之后,假如有 1000 个页面,调试时只要调其中的 5 个页面,最终就会只编译这 5 个页面

而 Umi 是如何做到的呢?他们使用了临时文件来占位

在访问 url 的时候,只会加载当前的组件,其它路由组件都用 Loading 组件占位

虽然有些取巧,但简单有效

路由还有一些正在完善的功能,比如 keep-alive、AntD+路由自动生成菜单,最新的进展可以关注 Umi 的官方仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openssl 添加自定义算法_GitHub:用PyTorch实现17种深度强化学习算法

【新智元导读】深度强化学习已经在许多领域取得了瞩目的成就,并且仍是各大领域受热捧的方向之一。本文推荐一个用 PyTorch 实现了 17 种深度强化学习算法的教程和代码库,帮助大家在实践中理解深度 RL 算法。深度强化学习已经在许多领域取得了瞩目的成就&…

node linux脚本,用Shell脚本快速搭建Ubuntu下的Nodejs开发环境

nodejs的确是很火,以前倒腾过,但是从来没有认真记录下什么。在ubuntu下搭建它的开发环境尝尝鲜,有一个捷径,它能让系统自动帮你安装所需要的东西,我们生成一段shell脚本,让它来完成以下工作:安装…

sync是同步还是非同步_音视频是怎么保持同步的?(四)

今天我们来继续讲音视频是怎么保持同步的。常用同步策略前面已经说了,实现音视频同步,在播放时,需要进行选定一个重要参考时钟,读取帧上的时间戳,同时企业根据的参考时钟来动态管理调节播放。它是目前已知的是&#xf…

openssl 测试加密卡_OpenSSL自带的aes_128_ecb加密函数——密文长度测试

OpenSSL自带的aes_128_ecb加密函数——密文长度测试发表于2017年11月29日 阅读人数(3608)近来要用到对称加密,就是使用了openssl的库给文件加密,选择的128位的分块加密,对称加密有分块加密和流加密两种。在实验中要考虑文件的长度所以关注到了…

linux命令行安装谷歌浏览器,Linux(ubuntu) 三行代码搞定安装谷歌浏览器

.NET微信公众号开发-4.0公众号消息处理一.前言 微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文消息,到图片消息,语音消息,视频消息,音乐消息其基本原理都是一样的,只不过所post的xml数据有所差别,在处理消息之前,我们 ...2、面向对象以…

电脑下面的任务栏怎么取消隐藏_电脑工具栏怎么调到下面

任务栏的隐藏与显示很简单,有时我们在需要时可以灵活的将其隐藏,还原,下面为大家介绍一下电脑工具栏怎么调到下面的方法。电脑工具栏怎么调到下面一、直接使用鼠标拖拽的方式移动“任务栏”用鼠标左键按住任务栏的空白区域不放,拖…

uiswitch样式_Swift - 表格UITableView的plain、grouped两种样式详解(附分组头悬停)

在表格 tableview初始化的时候我们可以指定需要使用的 UITableViewStyle样式,可用的样式一共有两种:.plain和 .grouped。下面分别对它们做介绍。一、plain模式1,默认样式在 plain模式下,如果 tableview有多个 section(分区、分组)…

全志线刷工具如何刷linux,全志 Allwinner V3S 开发环境搭建 (二)安装必要工具

1、libncurses5-devsudo apt-get install libncurses5-devmake menuconfig 配置工程时用到2、GITsudo apt-get install git下载github仓库时使用3、arm-linux-gnueabihf编译工具链下载:wget https://releases.linaro.org/components/toolchain/binaries/latest/arm-…

excel怎么启用宏_IT技巧分享51: 解决打开Excel文件提示发现不可读取的内容

在使用过程中难免会碰到一些棘手的问题,比如:Excel打不开,提示为不可读取内容,当遇到这些问题我们改怎么处理呢?经百度一下发现主要原因是因为引用了外部文档数据、指向了外部文档中的宏等等。造成故障的原因&#xff…

python输出矩阵的转置_Python 矩阵转置的几种方法小结

我就废话不多说了,直接上代码吧!#Python的matrix转置matrix [[1,2,3,4],[5,6,7,8],[9,10,11,12]]def printmatrix(m):for ele in m:for i in ele:print("%2d" %i,end " ")print()#1、利用元祖的特性进行转置def transformMatrix(m…

linux加一个2t硬盘吗,在linux下新增一块硬盘的操作。(包含大于2T的硬盘在linux下挂载操作)...

扩展后执行fdisk -l查看是否成功[rootlocalhost ~ ]# fdisk - lDisk / dev / sda: 16.1 GB, 16106127360 bytes255 heads, 63 sectors / track, 1958 cylindersUnits cylinders of 16065 * 512 8225280 bytesDevice Boot Start End …

JQ 全选后获取选中的值_JQ完全学习版本

获得input标签中name属性名字包含a 的标签对象书写。Function(“input[name * a]”)$("input:disabled")这个选择器的作用Input下隐藏的对象$(":input")和$("input");这两个选择器的区别前者是表单的内容,后者是所有input标签获得一个…

audio h5 src 变了之后_我在叩丁狼学H5

#我在叩丁狼学H5#最近接触到了一些前端框架,像Vue.js,React,发现小程序的框架体系跟它们很像。它们都推崇模块化,组件化,数据与元素绑定。这样没有繁琐的DOM操作,组件之间完全分离,样式和逻辑全…

linux的samb配置文件,Linux系统如何配置samba文件服务器?

安装samba服务软件包.1.确认当前系统中至少安装有samba、samba-client、samba-common这三个软件包,命令如下:[rootlinux-01~]#rpm-qa|grepsambasamba-common-3.0.33-3.7.el5samba-3.0.33-3.7.el5samba-client-3.0.33-3.7.el52.有时在安装samba包时可能会出现下面的错误提示:[ro…

依据imu姿态角计算z轴倾角_1. 姿态的表示方法

刚体的姿态(attitude)有很多种表示方法,关于这个话题有一篇十分出名的综述[1],也是这篇文章的主要资料来源。这篇文章从二维旋转开始,会讨论旋转矢量、旋转矩阵、四元数、欧拉角等旋转的表示方法。在开始讨论前&#x…

c# mongodb or查询_C# MongoDB 查询方法

public List GetCollectionByBillCode(string BillCode){List list new List();// 根据集合名称获取集合string collectionFullName ConfigurationManager.AppSettings["collectionName"];var collection _database.GetCollection(collectionFullName);var quert …

linux nacos启动_Nacos集群安装配置

上篇文章讲到Nacos从v1.3.2开始,windows系统启动脚本默认改成了集群模式(也就是不带参数"-m standalone"),那么如果双击startup.cmd启动就会失败。这篇文章我们就来讲讲Nacos集群安装。需要安装MySQL安装MySql这里就不讲了,大家找度…

linux 动态库静态库,Linux下的动态库与静态库

2019-09-25关键字:生成库、静态库引用、动态库引用在 C 开发中,“库”是一个经常听到的名词。所谓的库其实就是一个二进制文件。这个二进制文件的内容是可被其它C程序调用执行的函数。换句话说,库就是一组C代码的打包形式而已,打包…

西门子plm_西门子的Teamcenter、TIA Portal、NX MCD是如何结合在一起的

写在面前大家好,我是小智,智能制造之家号主~我一直PLM、MESMOM、SCADA、PLC等提倡融合(理念不一定对哈,大家理性看待,不必喷我),希望每个领域的朋友,在自己努力之余,抬头看看窗外的世界&#xf…

状态机 python_Python状态机设计

我真的不明白这个问题。设计模式非常清晰。请参阅Design Patterns book。class SuperState( object ):def someStatefulMethod( self ):raise NotImplementedError()def transitionRule( self, input ):raise NotImplementedError()class SomeState( SuperState ):def someStat…