《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 小白纪实(三)—— 震惊!路由竟然如此强大!的更多相关文章

  1. Umi 小白纪实(一)—— 创建项目&常用配置

    umi 是一个企业级 react 应用框架,也是蚂蚁金服的底层前端框架 <蚂蚁金服的前端框架和工程化实践> 一.安装脚手架 在创建项目之前,需要保证有 node 8.10 以上的环境 可以 ...

  2. Umi 小白纪实(二)—— model 的注册与使用

    Umi 通常会搭配 Dva 使用,用于管理页面状态和逻辑 一.注册 model 首先需要在 .umirc.js 中启用 dva 插件 export default { plugins: [ ['umi ...

  3. asp.net mvc 之旅—— 第三站 路由模板中强大的自定义IRouteConstraint约束

    我们在写mvc的时候,经常会配置各种url模板,比如controller,action,id 组合模式,其实呢,我们还可以对这三个参数进行单独的配置,采用的方式自然 就是MapRoute中的const ...

  4. Django基础三之路由、视图、模板

    Django基础三之路由.视图.模板 目录 Django基础三之路由.视图.模板 1. Django 请求和返回周期 1.1 路由层之路由匹配 1.2 有名分组 1.3 无名分组 2. 反射解析 3. ...

  5. 暑假打工 2 个 月,让我明白了 Keepalived 高可用的三种路由方案

    暑假打工 2 个 月,让我明白了 Keepalived 高可用的三种路由方案 这是悟空的第 158 篇原创文章 原文链接:首发悟空聊架构 官网:www.passjava.cn 你好,我是悟空. 前言 ...

  6. nodejs学习笔记<三>关于路由(url)

    在网站开发中,路由的设置非常关键.nodejs对路由处理封装了一个比较全面的模块. 来认识下url模块 1)在命令行(cmd)可以直接 node —> url 可直接查看url模块的所有方法. ...

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

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

  8. Vue:(三)路由

    (一)基础介绍 vue-router用来构建SPA <router-link></router-link>或者this.$router.push({path:' '}) < ...

  9. Angular4学习笔记(三)- 路由

    路由简介 路由是 Angular 应用程序的核心,它加载与所请求路由相关联的组件,以及获取特定路由的相关数据.这允许我们通过控制不同的路由,获取不同的数据,从而渲染不同的页面. 相关的类 Routes ...

随机推荐

  1. Python的小括号( )、中括号[ ]和大括号{}分别代表什么?

    python语言最常见的括号有三种,分别是:小括号( ).中括号[ ]和大括号也叫做花括号{ },分别用来代表不同的python基本内置数据类型. 1.python中的小括号( ):代表tuple元组 ...

  2. Eclipse PyDEV 和 SVN 插件安装指南

    安装PyDEV 及 SVN 插件 一.Eclipse->help->install newsoftware 配置pydev解释器 在Eclipse菜单栏中,点击Windows ->P ...

  3. TypeScript——基本类型

    关于数据类型 原始类型 let bool: boolean = true; let num: number = 1; let str: string = 'i am string'; 引用类型 let ...

  4. 深入了解Zookeeper

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项目,其 ...

  5. MySQL8.0 MIC高可用集群搭建

    mysql8.0带来的新特性,结合MySQLshell,不需要第三方中间件,自动构建高可用集群. mysql8.0作为一款新产品,其内置的mysq-innodb-cluster(MIC)高可用集群的技 ...

  6. 1751: n个素数构成等差数列

    #include <stdio.h>int fill(char *map,int *primes) { for (int i = 2; i < 1001; i++) { map[i] ...

  7. 面试官:能解释一下javascript中bind、apply和call这三个函数的用法吗

    一.前言    不知道大家还记不记得前几篇的文章:<面试官:能解释一下javascript中的this吗> 那今天这篇文章虽然是介绍javascript中bind.apply和call函数 ...

  8. 隐马尔可夫(HMM)/感知机/条件随机场(CRF)----词性标注

    笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 7. 词性标注 7.1 词性标注概述 什么是词性 在语言学上,词性(Par-Of- ...

  9. LoadRunner随机数

    需求:自定义随机数 方法: int randomnumber; randomnumber = rand()%+; //100到300的随机数 lr_output_message("ca:%d ...

  10. FPGA VGA+PLL+IP核笔记

    1.实现了预定功能!整个工程,没有使用例程的25MHZ,全部统一使用50MHZ.2.分辨率使用了800*600@72HZ.3.实现了只显示白色部分,黑色部分RGB == 0,要显示背景色.VGA图形基 ...