umi 会根据 pages 目录自动生成路由配置。

1. 约定式路由

1.1 基础路由
假设 pages 目录结构如下:

+ pages/+ users/- index.js- list.js- index.js

那么,umi 会自动生成路由配置如下:

[{ path: '/', component: './pages/index.js' },{ path: '/users/', component: './pages/users/index.js' },{ path: '/users/list', component: './pages/users/list.js' },
]

1.2 动态路由
umi 里约定,带 $ 前缀的目录或文件为动态路由。
比如以下目录结构:

+ pages/+ $post/- index.js- comments.js+ users/$id.js- index.js

会生成路由配置如下:

[{ path: '/', component: './pages/index.js' },{ path: '/users/:id', component: './pages/users/$id.js' },{ path: '/:post/', component: './pages/$post/index.js' },{ path: '/:post/comments', component: './pages/$post/comments.js' },
]

1.3 可选的动态路由
umi 里约定动态路由如果带 $ 后缀,则为可选动态路由。
比如以下结构:

+ pages/+ users/- $id$.js- index.js

会生成路由配置如下:

[{ path: '/': component: './pages/index.js' },{ path: '/users/:id?': component: './pages/users/$id$.js' },
]

1.4 嵌套路由
umi 里约定目录下有 _layout.js 时会生成嵌套路由,以 _layout.js 为该目录的 layout 。
比如以下目录结构:

+ pages/+ users/- _layout.js- $id.js- index.js

会生成路由配置如下:

[{ path: '/users': component: './pages/users/_layout.js'routes: [{ path: '/users/', component: './pages/users/index.js' },{ path: '/users/:id', component: './pages/users/$id.js' },],},
]

1.5 全局 layout
约定 src/layouts/index.js 为全局路由,返回一个 React 组件,通过 props.children 渲染子组件。

export default function(props) {return (<><Header />{ props.children }<Footer /></>);
}

1.6 不同的全局 layout
你可能需要针对不同路由输出不同的全局 layout,umi 不支持这样的配置,但你仍可以在 layouts/index.js 对 location.path 做区分,渲染不同的 layout 。

比如想要针对 /login 输出简单布局,

export default function(props) {if (props.location.pathname === '/login') {return <SimpleLayout>{ props.children }</SimpleLayout>}return (<><Header />{ props.children }<Footer /></>);
}

1.7 404路由
约定 pages/404.js 为 404 页面,需返回 React 组件。

export default () => {return (<div>I am a customized 404 page</div>);
};

注意:开发模式下,umi 会添加一个默认的 404 页面来辅助开发,但你仍然可通过精确地访问 /404 来验证 404 页面。

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

+ pages/- index.js

如果 pages/index.js 里包含:

/*** title: Index Page* Routes:*   - ./src/routes/a.js*   - ./src/routes/b.js*/

则会生成路由配置:

[{ path: '/', component: './index.js',title: 'Index Page',Routes: [ './src/routes/a.js', './src/routes/b.js' ],},
]

2. 配置式路由

如果你倾向于使用配置式的路由,可以配置 routes ,此配置项存在时则不会对 src/pages 目录做约定式的解析。
注意:component是相对于src/pages 目录的

export default {routes: [{ path: '/', component: './a' },{ path: '/list', component: './b', Routes: ['./routes/PrivateRoute.js'] },{ path: '/users', component: './users/_layout',routes: [{ path: '/users/detail', component: './users/detail' },{ path: '/users/:id', component: './users/id' }]},],
};

3. 权限路由

umi 的权限路由是通过配置路由的 Routes 属性来实现。约定式的通过 yaml 注释添加,配置式的直接配上即可。
比如有以下配置:

[{ path: '/', component: './pages/index.js' },{ path: '/list', component: './pages/list.js', Routes: ['./routes/PrivateRoute.js'] },
]

然后 umi 会用 ./routes/PrivateRoute.js 来渲染 /list。
./routes/PrivateRoute.js 文件示例:

export default (props) => {return (<div><div>PrivateRoute (routes/PrivateRoute.js)</div>{ props.children }</div>);
}

4. 路由动效

路由动效应该是有多种实现方式,这里举 react-transition-group 的例子。
先安装依赖

yarn add react-transition-group

在 layout 组件(layouts/index.js 或者 pages 子目录下的 _layout.js)里在渲染子组件时用 TransitionGroup 和 CSSTransition 包裹一层,并以 location.key 为 key,

import withRouter from 'umi/withRouter';
import { TransitionGroup, CSSTransition } from "react-transition-group";export default withRouter(({ location }) =><TransitionGroup><CSSTransition key={location.pathname} classNames="fade" timeout={300}>{ children }</CSSTransition></TransitionGroup>
)

上面用到的 fade 样式,可以在 src 下的 global.css 里定义:

.fade-enter {opacity: 0;z-index: 1;
}.fade-enter.fade-enter-active {opacity: 1;transition: opacity 250ms ease-in;
}

5. 面包屑

面包屑也是有多种实现方式,这里举 react-router-breadcrumbs-hoc 的例子。
先安装依赖

yarn add react-router-breadcrumbs-hoc

然后实现一个 Breakcrumbs.js,比如:

import NavLink from 'umi/navlink';
import withBreadcrumbs from 'react-router-breadcrumbs-hoc';// 更多配置请移步 https://github.com/icd2k3/react-router-breadcrumbs-hoc
const routes = [{ path: '/', breadcrumb: '首页' },{ path: '/list', breadcrumb: 'List Page' },
];export default withBreadcrumbs(routes)(({ breadcrumbs }) => (<div>{breadcrumbs.map((breadcrumb, index) => (<span key={breadcrumb.key}><NavLink to={breadcrumb.props.match.url}>{breadcrumb}</NavLink>{(index < breadcrumbs.length - 1) && <i> / </i>}</span>))}</div>
));

6. 启用 Hash 路由

umi 默认是用的 Browser History,如果要用 Hash History,需配置:

export default {history: 'hash',
}

7. Scroll to top

在 layout 组件(layouts/index.js 或者 pages 子目录下的 _layout.js)的 componentDidUpdate 里决定是否 scroll to top,比如:

import { Component } from 'react';
import withRouter from 'umi/withRouter';class Layout extends Component {componentDidUpdate(prevProps) {if (this.props.location !== prevProps.location) {window.scrollTo(0, 0);}}render() {return this.props.children;}
}export default withRouter(Layout);

8. 在页面间跳转

在 umi 里,页面之间跳转有两种方式:声明式和命令式。
8.1 声明式
基于 umi/link,通常作为 React 组件使用。

import Link from 'umi/link';export default () => (<Link to="/list">Go to list page</Link>
);

8.2 命令式
基于 umi/router,通常在事件处理中被调用。

import router from 'umi/router';function goToListPage() {router.push('/list');
}

来源https://umijs.org/zh/guide/config.html

UmiJS介绍--路由(三)相关推荐

  1. 生动的SDN基础内容介绍(三)--Ryu控制器

    生动的SDN基础内容介绍(三)--Ryu控制器 控制器 Ryu的目录 Ryu的学习 simple_switch_13.py simple_switch_rest_13.py 交换机信息及流表项的查询 ...

  2. asp.net session 介绍一三种Session存储方式

    asp.net session 介绍一三种Session存储方式 www.firnow.com 时间:2009-03-04 作者:匿名 编辑:sky 点击: 1478 [评论] 对于asp.net的程 ...

  3. 传统公司部署OpenStack(t版)简易介绍(三)——Glance组件部署

    传统公司部署OpenStack(t版)简易介绍(三)--Glance组件部署 一.创建数据库实例和数据库用户 二.创建用户.修改配置文件 总结:Glance部署思路 一.创建数据库实例和数据库用户 m ...

  4. [深度学习] 分布式Pytorch介绍(三)

    [深度学习] 分布式模式介绍(一) [深度学习] 分布式Tensorflow介绍(二) [深度学习] 分布式Pytorch介绍(三) [深度学习] 分布式Horovod介绍(四)  一  Pytorc ...

  5. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析

    原文网址:http://blog.csdn.net/xubin341719/article/details/38584469 关键词:蓝牙blueZ  A2DP.SINK.sink_connect.s ...

  6. 三分钟计算机自我介绍面试,三分钟面试自我介绍【三篇】

    [导语]自我介绍是向别人展示你自己的一个重要手段,自我介绍好不好,甚至直接关系到你给别人的第一印象的好坏及以后交往的顺利与否.同时,也是认识自我的手段.以下是无忧考网整理的三分钟面试自我介绍,欢迎阅读 ...

  7. 【C语言】-关于strlen的介绍以及三种模拟实现的方法

    作者:低调 作者宣言:写好每一篇博客 文章目录 前言 一.strlen函数的使用 二.strlen函数的模拟实现 2.1创建临时变量法 2.2递归法 2.3指针法 总结 前言 今天我们来讲解一下str ...

  8. v5行为验证使用介绍(三)- 程序接入流程

    目录 v5行为验证使用介绍(一)- 试探攻击的威胁 v5行为验证使用介绍(二)- 应用管理 v5行为验证使用介绍(三)- 程序接入流程 v5行为验证使用介绍(四)- Verify5Client.jav ...

  9. Chatbot-检索式模型介绍(三)

    检索式模型介绍(三) 这个系列的文章主要是介绍一些可以作为文本匹配工作的一些模型,有些是比较基础的算法,例如bm25.有些模型是基于深度学习的架构,比如说deepMatch模型.个人认为文本匹配的任务 ...

  10. SDIO wifi Marvell8801/Marvell88w8801 介绍(三) ---- Marvell8801/Marvell88w8801寄存器介绍

    代码工程的GITHUB连接:点进进入GITHUB仓库 https://github.com/sj15712795029/stm32f1_marvell88w8801_marvell8801_wifi ...

最新文章

  1. 【经验心得】CS1.6:经典中的精品
  2. 在64位linux下编译32位程序
  3. Flowable 数据库表结构 ACT_HI_VARINST
  4. linux 实现共享内存同步
  5. (转)淘淘商城系列——商品搜索功能Service实现
  6. 3d激光雷达开发(八叉树)
  7. Labview学习笔记(一)
  8. Centos7下搭建单节点Zookeeper
  9. SAP ABAP代码下载 备份
  10. IDEA炫酷主题推荐!非常好看!
  11. python社交网络分析 书籍_使用Python分析社交网络数据电子书.pdf
  12. 骁龙cpu linux内核,高通骁龙888 SoC在Linux 5.12内核才被支持,以往怎么兼容的?
  13. vs商业智能项目的安装
  14. T51 运行文本指令
  15. 洛谷P3387 【模板】缩点 题解
  16. stm32正常运行流程图_深度分析:主流32位单片机为什么要学STM32?-可编程逻辑-与非网...
  17. clickhouse-jdbc 源码学习
  18. 职场必知必会:PPT 制作六步心法分享
  19. 计算机管理没有固态硬盘,电脑的BIOS中没有固态硬盘启动选项怎么办?
  20. python爬取网页json数据_python爬取json数据库

热门文章

  1. VMware Centos7下载安装教程(超详细)
  2. 根据 ”艾宾浩斯遗忘曲线“复习时间点生成的复习计划模板
  3. unity游戏开发毕设_基于unity游戏引擎的游戏设计毕设论文.doc
  4. 原型工具MockingBot 墨刀
  5. SpringBoot +esapi 实现防止xss攻击
  6. 黑苹果OC的血泪史之硬盘(三星固态1T)篇
  7. fdfs手动上传下载
  8. APP渗透技巧----------逆向app破解数据包sign值实现任意数据重放添加
  9. GT Transceiver中的重要时钟及其关系(1)GT Transceiver参考时钟
  10. 计算机缺少网络插口,笔记本电脑没有网线插口且USB接口太少怎么办?