《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. AI初探1

    一个典型的机器学习的过程,首先给出一个输入数据,我们的算法会通过一系列的过程得到一个估计的函数,这个函数有能力对没有见过的新数据给出一个新的估计,也被称为构建一个模型.就如同上面的线性回归函数. 在机 ...

  2. vue响应式原理的实现

    响应式实现的原理---如何监控数据的变化:两种方法 Vue 2.x defineProperty(es5) Vue 3.x Proxy(es6) 语法:Object.defineProperty(参数 ...

  3. C# 定时器导致的内存泄露问题

    C# 中有三种定时器,System.Windows.Forms 中的定时器和 System.Timers.Timer 的工作方式是完全一样的,所以,这里我们仅讨论 System.Timers.Time ...

  4. SVN : 在SVN检测下来的Maven项目没有Maven标志

    在Ecplise使用import->从SVN检出项目, 检出的项目没有了 Maven标志 解决方案 右键点击项目->configure->Convert to Maven Proje ...

  5. Gloang Swagger

    功能 自动化生产接口文档 安装 # 安装swaggo get -u github.com/swaggo/swag/cmd/swag # 安装 gin-swagger go get -u github. ...

  6. 曹工说Spring Boot源码(14)-- AspectJ的Load-Time-Weaving的两种实现方式细细讲解,以及怎么和Spring Instrumentation集成

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  7. 20190710双人开黑CF模拟赛

    Codeforces Round #571 (Div. 2) 日常被tanao_大佬带飞,我AC了A和C(B题没了...否则tanao_大佬肯定把我吊打) A. Vus the Cossack and ...

  8. cpu负载高简单排查思路

    首先通过uptime查看系统负载,然后使用mpstat结合pidstat来初步判断到底是cpu计算量大还是进程争抢过大或者是io过多,接着使用vmstat分析切换次数,以及切换类型,来进一步判断到底是 ...

  9. nginx适用哪些场景

    1.静态资源服务 通过本地文件系统提供服务 2.反向代理服务 ningx的强大性能 缓存 负载均衡 3.API服务 openresty

  10. DLL/EXE查看工具Dumpbin

    一般情况下,我们需要查看一个DLL或EXE中的包含的函数或是依赖的函数之类的信息,可以使用VS自带的工具dumpbin: 可以直接在命令行下输入dumpbin就可以查看他的使用说明,如果未显示,可以先 ...