什么是路由

在点击导航选项的时候,让对应内容填充的到页面,实现这种效果的方式就是路由。简单来说,路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径来请求不同的资源。

在 umi 中,应用都是单页应用,页面地址的跳转都是在浏览器端实现的,不会去重新请求服务端获取 html。html 只是在应用初始化的时候加载一次。所有的页面都是由不同的组件构成,页面的切换其实就是不同组件的切换,你只需要在配置中把不同的路由路径和对应的组件关联上即可。单页应用的功能示意图如下:

路由配置 - 图1

路由配置方法

在 umi 应用中,路由的配置是在/config/config.jsexports.routes 中配置。

基本

exports.routes 需要是一个数组,数组中的每一个对象是一个路由信息,比如:

  1. exports.routes = [
  2. {
  3. path: '/',
  4. component: 'App',
  5. },
  6. {
  7. path: '/user',
  8. component: 'User',
  9. }
  10. ];

其中,path 表示页面访问路径,component 表示 page 下的文件名,比如 App, User 分别表示 page/Apppage/User。这样,访问 http://localhost:7001/http://localhost:7001/user 则会有展示 App, User 中的内容。

routes

当需要有一个 layout 作为展示,可以设置 routes

  1. exports.routes = [
  2. {
  3. path: '/',
  4. component: 'App',
  5. routes: [{
  6. path: 'list'
  7. component: 'List',
  8. }, {
  9. path: 'admin'
  10. component: 'Admin',
  11. }]
  12. },
  13. {
  14. path: '/user',
  15. component: 'User',
  16. }
  17. ];

page/App 中:

  1. export default (props) => <div style={{padding: 20}}>
  2. {this.props.children}
  3. </div>

这样访问 /list/admin 将会都有这个 layout

更多配置信息和路由使用方式请参考 umi 官方文档。

实战配置

我们已经知道了如何在 umi 中配置路由了,那么下面就来实操一把。

第一步:创建页面组件

根据侧边导航样式,我们在 Dashboard 这个目录层级下有三个页面组件需要创建。

src/page 文件夹下创建 Dashboard 文件夹,同时在该文件夹中新建 Analysis.js, Monitor.js, Workplace.js 三个文件,目录结构如下:

  1. .
  2. ├── Dashboard
  3. ├── Analysis.js
  4. ├── Monitor.js
  5. └── Workplace.js
  6. ...// 省略其他章节中的目录

三个文件中,我们分别添加简单的函数组件。

  1. // Analysis.js
  2. export default () => {
  3. return <h1>Analysis Page</h1>
  4. }
  1. // Monitor.js
  2. export default () => {
  3. return <h1>Monitor Page</h1>
  4. };
  1. // Workplace.js
  2. export default () => {
  3. return <h1>Workplace Page</h1>
  4. };

第二步:配置应用路由

在《初始化项目》一节中你已经用配置式路由添加了 helloworld 路由,这里在 config.js 中我们添加本章的三个路由:

  1. export default {
  2. routes: [{
  3. path: '/',
  4. component: '../layout',
  5. routes: [
  6. {
  7. path: '/',
  8. component: 'Helloworld',
  9. },
  10. {
  11. path: '/helloworld',
  12. component: 'Helloworld'
  13. },
  14. {
  15. path: '/dashboard',
  16. routes: [
  17. { path: '/dashboard/analysis', component: 'Dashboard/Analysis' },
  18. { path: '/dashboard/monitor', component: 'Dashboard/Monitor' },
  19. { path: '/dashboard/workplace', component: 'Dashboard/Workplace' }
  20. ]
  21. },
  22. ]
  23. }],
  24. };

这段配置的意思是指:

  • 访问 / 下面的路由的时,使用 page 文件夹下的 ../layout 布局文件渲染页面,默认展示Helloworld组件

  • 访问 /dashboard/analysis 时,使用 page 文件夹下的 Dashboard/Analysis 组件渲染到 layout 文件中 children 部分

  • 访问 /dashboard/monitor 时,使用 page 文件夹下的 Dashboard/Monitor 组件渲染到 layout 文件中 children 部分

  • 访问 /dashboard/workplace 时,使用 page 文件夹下的 Dashboard/Workplace 组件渲染到 layout 文件中 children 部分

第三步:配置侧边栏导航

万事俱备,只欠东风,路由已经和相应的页面组件关联起来了,现在我们只需要配置导航,使得能在点击导航时,触发 URL 刷新,路由根据配置返回和当前 URL 匹配的内容.

我们用 Link 组件(相当于) 实现路由的跳转.

  1. import Link from 'umi/link';
  2. ...
  3. <Sider width={256} style={{ minHeight: '100vh' }}>
  4. <div style={{ height: '32px', background: 'rgba(255,255,255,.2)', margin: '16px'}}/>
  5. <Menu theme="dark" mode="inline" defaultSelectedKeys={['1']}>
  6. <Menu.Item key="1">
  7. <Link to="/helloworld">
  8. <Icon type="pie-chart" />
  9. <span>Helloworld</span>
  10. </Link>
  11. </Menu.Item>
  12. <SubMenu
  13. key="sub1"
  14. title={<span><Icon type="dashboard" /><span>Dashboard</span></span>}
  15. >
  16. <Menu.Item key="2"><Link to="/dashboard/analysis">分析页</Link></Menu.Item>
  17. <Menu.Item key="3"><Link to="/dashboard/monitor">监控页</Link></Menu.Item>
  18. <Menu.Item key="4"><Link to="/dashboard/workplace">工作台</Link></Menu.Item>
  19. </SubMenu>
  20. </Menu>
  21. </Sider>

页面效果如下:

路由配置 - 图2

结语

至此我们的 demo 应用现在已经支持了最朴素的路由和布局了。实际项目中,我们会通过各种方式,优化整个布局和路由的实现过程(比如将导航菜单配置化,抽象出单独的侧边栏组件和顶部导航组件等),但最基本的原理与上面的简单应用是一样的。

那我们的侧边栏导航是不是至此就功能完备了呢?并没有,实际上还有很多的细节没有实现,比如当页面的url改变后导航要能够根据url路径的不同展开对应的导航菜单等,为了避免大家陷入到细节中,这里不做具体探讨,感兴趣的同学可以参考Ant Design Pro的代码进行深入阅读。