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(, );
}
}
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 的官方仓库
Umi 小白纪实(三)—— 震惊!路由竟然如此强大!的更多相关文章
- Umi 小白纪实(一)—— 创建项目&常用配置
umi 是一个企业级 react 应用框架,也是蚂蚁金服的底层前端框架 <蚂蚁金服的前端框架和工程化实践> 一.安装脚手架 在创建项目之前,需要保证有 node 8.10 以上的环境 可以 ...
- Umi 小白纪实(二)—— model 的注册与使用
Umi 通常会搭配 Dva 使用,用于管理页面状态和逻辑 一.注册 model 首先需要在 .umirc.js 中启用 dva 插件 export default { plugins: [ ['umi ...
- asp.net mvc 之旅—— 第三站 路由模板中强大的自定义IRouteConstraint约束
我们在写mvc的时候,经常会配置各种url模板,比如controller,action,id 组合模式,其实呢,我们还可以对这三个参数进行单独的配置,采用的方式自然 就是MapRoute中的const ...
- Django基础三之路由、视图、模板
Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...
- 暑假打工 2 个 月,让我明白了 Keepalived 高可用的三种路由方案
暑假打工 2 个 月,让我明白了 Keepalived 高可用的三种路由方案 这是悟空的第 158 篇原创文章 原文链接:首发悟空聊架构 官网:www.passjava.cn 你好,我是悟空. 前言 ...
- nodejs学习笔记<三>关于路由(url)
在网站开发中,路由的设置非常关键.nodejs对路由处理封装了一个比较全面的模块. 来认识下url模块 1)在命令行(cmd)可以直接 node —> url 可直接查看url模块的所有方法. ...
- angular路由详解三(路由参数传递)
我们经常用路由传递参数,路由主要有三种方式: 第一种:在查询参数中传递数据 {path:"address/:id"} => address/1 => Activa ...
- Vue:(三)路由
(一)基础介绍 vue-router用来构建SPA <router-link></router-link>或者this.$router.push({path:' '}) < ...
- Angular4学习笔记(三)- 路由
路由简介 路由是 Angular 应用程序的核心,它加载与所请求路由相关联的组件,以及获取特定路由的相关数据.这允许我们通过控制不同的路由,获取不同的数据,从而渲染不同的页面. 相关的类 Routes ...
随机推荐
- Python读取字典(Dictionary)内数据的方法
读取json后,数据类型为字典,对字典内数据的提取又有不同的方法,根据不同的字典类型 上图可以看到有”[]”,”{}” python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也 ...
- Mac系统 python2.7中安装MySQLdb
由于要在python2.7上使用到MySQLdb连接数据库,所以要安装MySQLdb,也就是MySQL-Python.安装之前已经有人告诉我,这个东西比较难装,果然我也遇到好多问题,在百度找了半天,发 ...
- Ubuntu16.04-Server固定静态IP
1. 查看IP信息-ifconfig 2.修改配置文件---sudo vim /etc/network/interfaces 修改为静态ip 配置说明: auto ens33:使用的网络接口 ifa ...
- hash算法与拉链法解决冲突
<?php class HashNode { public $key; public $value; public $nextNode; public function __construct( ...
- laravel 服务容器的由来 代码展示
<?php /** * 目的:代码的完善来说明从 基础类的调用到 工厂类的使用 再到容器的出现的原因 * (首先要明白工厂类和容器的关系 可以理解:容器就是工厂类的升级版(为了解决类的依赖)) ...
- 【WPF学习】第二十九章 元素绑定——将元素绑定到一起
数据banding的最简单情形是,源对象时WPF元素而且源属性是依赖性属性.前面章节解释过,依赖项属性具有内置的更改通知支持.因此,当在源对象中改变依赖项属性的值时,会立即更新目标对象中的绑定属性.这 ...
- tomcat 持久区溢出
知识点:堆内存设置(JVM堆内存)java的堆内存分为两块:permantspace(持久带) 和 heap spaceOOM1.年老代溢出,表现为:java.lang.OutOfMemoryErro ...
- 并发队列之LinkedBlockingQueue
上一篇我们看了一下这个队列ConcurrentLinkedQueue,那就是一个无界非阻塞链表,我们这次来看看LinkedBlockingQueue,这个队列看名字就知道是一个阻塞式队列(也就是一个单 ...
- 【WPF学习】第三十三章 高级命令
前面两章介绍了命令的基本内容,可考虑一些更复杂的实现了.接下来介绍如何使用自己的命令,根据目标以不同方式处理相同的命令以及使用命令参数,还将讨论如何支持基本的撤销特性. 一.自定义命令 在5个命令类( ...
- 牛客练习赛39 C 流星雨 (概率dp)
题意: 现在一共有n天,第i天如果有流星雨的话,会有wi颗流星雨. 第1天有流星雨的概率是p1. 如果第i−1 (i≥2)天有流星雨,第i天有流星雨的可能性是pi+P,否则是pi. 求n天后,流星雨颗 ...