《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. ios--->instrument的leaks来检查内存泄漏

    instrument来检查内存泄漏 1.第一步打开 或者: 然后选择leaks 2.若此时编译出现如下问题,可能是非debug版本造成的,切换成debug版本即可 打开工程的Edit Scheme选项 ...

  2. php--->依赖注入(DI)实现控制反转(IOC)

    依赖注入(DI)实现控制反转(IOC) DI和IOC概念理解 当一个类的实例需要另一个类的实例协助时,在传统的程序设计过程中,通常由调用者来创建被调用者的实例.而采用依赖注入的方式,创建被调用者的工作 ...

  3. android开发实战-记账本APP(二)

    继昨天的开发,继续完成今天的内容. (一)开始构建一些业务逻辑,开始构建记账本的添加一笔记账的功能. ①对fab按钮的click时间进行修改,创建一个AlertDialog.Builder对象,因此我 ...

  4. learn more ,study less(二):整体性学习技术(上)

    前言:在学习整体性学习概念时,一个很好的方法是把它比喻成下棋,首先你要了解下棋的 基本规则和基本目标,本书第一部分可以看做是介绍关于整体性学习的一整套规则和目标. 一旦你理解了下棋的基本规则,你就要开 ...

  5. 安装MySQL出现[Errno 256] No more mirrors to try

    今天安装数据库时出现错误提示,如下图: 解决办法如下: yum clean all #清除仓库缓存 yum makecache #将服务器包信息缓存到本地 然后再执行数据库安装指令 yum insta ...

  6. VC实现快递查询

    #include <iostream> #include <string> #include <cstdlib> #include <afxinet.h> ...

  7. 《Python学习手册 第五版》 -第7章 字符串基础

    本章内容是关于字符串的,字符串是编程中经常遇到的问题,本章的内容不是包含所有字符串的讲解,而是针对其最基本的内容进行说明,后续的相关章节会根据需要进行扩展和说明,例如后续的第37章内容会讲解Unico ...

  8. Java 代码实现链表

    Linked List 用多少就申请多少内存. 链表是一种链式存储的线性表,所有元素的内存地址不一定连续的. 接口设计 代码实现 MyList.java(接口) package com.cyb; pu ...

  9. 【OpenGL】OpenGL4.3常用指令目录

    参考OpenGL编程指南 第8版 VAO void glGenVertexArrays(GLsizei n, GLuint *arrays); 返回n个未使用的对象名到数组arrays中,用作顶点数组 ...

  10. 在centos6.3下安装php的Xdebug

    首先下载一个xdebug http://www.xdebug.org/docs/ 官网上有windos版本和linux源码版本的,我们下载一个源码包xdebug-2.2.5.tgz 然后进入安装流程 ...