# Umi.js 路由
# 约定式路由
什么是约定式路由,就是Umi约定好的路由。不需要自己配置即可使用。这里会梳理约定是的所有路由大纲,对于如何实现请点击这里Umi约定式路由 (opens new window)。
- 1、基础路由:page目录下所有的页面都会自动形成路由(没有配置路由的前提下)
- 2、动态路由:带 $ 前缀的目录或文件为动态路由。
- 3、可选路由:动态路由如果带 $ 后缀,则为可选动态路由。
- 4、嵌套路由:目录下有
_layout.js
时会生成嵌套路由,以_layout.js
为该目录的 layout 。 - 5、404 路由:约定 pages/404.js 为 404 页面。
- 6、注释扩展路由:路由文件的首个注释如果包含 yaml 格式的配置,则会被用于扩展路由。
# 配置式路由
如果你倾向于使用配置式的路由,可以配置 .umirc.(ts|js)
或者 config/config.(ts|js) 配置文件中的 routes 属性,此配置项存在时则不会对 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' }
]
},
],
};
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
component 是相对于 src/pages 目录的
# 权限路由
umi 的权限路由是通过配置路由的 Routes 属性来实现。约定式的通过 yaml 注释添加,配置式的直接配上即可。
比如有以下配置:
[
{ path: '/', component: './pages/index.js' },
{ path: '/list', component: './pages/list.js', Routes: ['./routes/PrivateRoute.js'] },
]
1
2
3
4
2
3
4
然后 umi 会用 ./routes/PrivateRoute.js 来渲染 /list。
./routes/PrivateRoute.js 文件示例:
import { Route, Redirect } from 'dva/router';
const AuthRouter = (props) => {
const { route } = props;
const { component:Component } = route;
return (
//true ? <Route {...route} /> : <Redirect to="/login" />
//这个也可以,跟下边的二选一,否则会报错
<Route render={ props => {
console.log(props);
return false ? <Component { ...props } /> : <Redirect to="/login" />
}} />
)
}
export default AuthRouter;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 路由动效
路由动效应该是有多种实现方式,这里举 react-transition-group 的例子。
# 面包屑
面包屑也是有多种实现方式,这里举 react-router-breadcrumbs-hoc 的例子。
# 启用 Hash 路由
umi 默认是用的 Browser History,如果要用 Hash History,需配置:
export default {
history: 'hash',
}
1
2
3
2
3
# 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);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15