react + react-router + redux + ant-Desgin 搭建react管理后台 — 页面布局(五)

释放双眼,带上耳机,听听看~!

前言

**** 学习总结使用,博客如中有错误的地方,请指正。改系列文章主要记录了搭建一个管后台的步骤,主要实现的功能有:使用路由模拟登录、退出、以及切换不同的页面;使用redux实现面包屑;引入使用其他常用的组件,比如highchart、富文本等,后续会继续完善。

github地址:https://github.com/huangtao5921/react-antDesgin-admin (欢迎Star)

**项目展示地址:https://huangtao5921.github.io/react-admin/ **

** **

一、配置侧边栏组件

上一篇文章中react + react-router + redux + ant-Desgin 搭建react管理后台 — 路由搭建(四)我们已经将将路由搭建好了,在浏览器中输入不同的url路径,能访问到不同的页面。接下来,我们要将管理后台的页面布局呈现出来。

首先我们将需要在侧边栏展示的路由全部放在一个文件中,方便管理,我们在前面建过一个src/config/menuConfig.js,就是为了放路由数组,接下来,我们将路由配置如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
1const menuConfig = [
2  {
3    title: '首页',
4    key: '/',
5    icon: 'home'
6  },
7  {
8    title: '用户',
9    key: '/user',
10    icon: 'user',
11    children: [
12      {
13        title: '联系',
14        key: '/user/connect',
15      },
16      {
17        title: '用户列表',
18        key: '/user/list',
19      },
20    ]
21  },
22  {
23    title: '组件',
24    key: '/tool',
25    icon: 'build',
26    children: [
27      {
28        title: '富文本',
29        key: '/tool/rich',
30      }
31    ]
32  }
33];
34
35export default menuConfig;
36

然后我们开始编写侧边栏以及顶部这两个组件,其实开发的时候我是先整体布好页面之后,再把组件拆分出去。这里为了快速展示,我直接上代码,还记得我们在src/component/layout里面新建了2个文件么?一个是header/HeaderBar.js,另一个是siderBar/SiderBar.js,这2个文件主要是为了放布局的组件。整个首页公共布局的样式,我们写在
app.css中。开始写我们的侧边栏组件
SiderBar.js代码,这里需要注意几点:

1.我们引入了menuConfig.js,在处理函数setMenu中,我们通过循环判断每一项中是否有children,有的话,我们继续调用setMenu,没有的话,返回一个<Menu.Item>,并将他的key值设置为<NavLink>的to属性,这里的<NavLink>就类似于<a>标签,to就是要跳转的地址;

2.onCollapse()函数:就是收缩侧边栏的操作;
3.defaultOpenKeys表示默认打开的父级侧边栏,defaultSelectedKeys表示默认选中的侧边栏,ant的文档可查;

4.为了减少篇幅css我就忽略了,全部的css在
app.css中。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
1import React from &#x27;react&#x27;;
2import { NavLink } from &#x27;react-router-dom&#x27;
3import { Menu, Icon, Layout } from &#x27;antd&#x27;;
4import menuConfig from &#x27;../../../config/menuConfig&#x27;;
5import logoURL from &#x27;../../../images/logo.jpeg&#x27;;
6const { Sider } = Layout;
7const { SubMenu } = Menu;
8
9class SiderBar extends React.Component {
10  state = {
11    collapsed: false,
12    menuList: [],
13    defaultOpenKeys: [],       // 默认展开
14    defaultSelectedKeys: [&#x27;/&#x27;],   // 默认选中
15  };
16
17  componentWillMount() {
18    const menuList = this.setMenu(menuConfig);
19    this.setState({
20      menuList
21    });
22  }
23
24  // 处理菜单列表
25  setMenu = (menu, pItem) =&gt; {
26    return menu.map((item) =&gt; {
27      if (item.children) {
28        return (
29          &lt;SubMenu key={ item.key }
30                   title={ &lt;span&gt;&lt;Icon type={ item.icon }/&gt;&lt;span&gt;{ item.title }&lt;/span&gt;&lt;/span&gt; }&gt;
31            { this.setMenu(item.children, item) }
32          &lt;/SubMenu&gt;
33        )
34      }
35      return (
36        &lt;Menu.Item title={ item.title } key={ item.key } pitem={ pItem }&gt;
37          &lt;NavLink to={ item.key } &gt;
38            { item.icon &amp;&amp; &lt;Icon type={ item.icon }/&gt; }
39            &lt;span&gt;{ item.title }&lt;/span&gt;
40          &lt;/NavLink&gt;
41        &lt;/Menu.Item&gt;
42      )
43    });
44  };
45
46  // 收缩侧边栏
47  onCollapse = collapsed =&gt; {
48    this.setState({ collapsed });
49  };
50
51  render() {
52    let name;
53    if (!this.state.collapsed) {
54      name = &lt;span className=&quot;name&quot;&gt;React管理后台&lt;/span&gt;;
55    }
56    return (
57      &lt;Sider collapsible collapsed={ this.state.collapsed } onCollapse={ this.onCollapse }&gt;
58        &lt;div className=&quot;logo&quot;&gt;
59          &lt;img className=&quot;logo-img&quot; src={ logoURL } alt=&quot;&quot;/&gt;
60          { name }
61        &lt;/div&gt;
62        &lt;Menu theme=&quot;dark&quot;
63              defaultOpenKeys={ this.state.defaultOpenKeys }
64              defaultSelectedKeys={ this.state.defaultSelectedKeys }
65              mode=&quot;inline&quot;&gt;
66          { this.state.menuList }
67        &lt;/Menu&gt;
68      &lt;/Sider&gt;
69    );
70  }
71}
72
73export default SiderBar;
74

 

二、配置头部组件

目前为止,侧边栏已经搭建完毕,继续搭建
HeaderBar.js组件,头部组件没有什么难点,就是引入了一些基本的ant组件,将用户头像部分又拆成了一个组件,样式同样写在了
app.css中,代码如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
1import React from &#x27;react&#x27;;
2import { Layout, Menu, Dropdown, Icon, Breadcrumb } from &#x27;antd&#x27;;
3import customUrl from &#x27;../../../images/custom.jpeg&#x27;;
4const { Header } = Layout;
5
6class UserInfo extends React.Component {
7  state = {
8    visible: false,   // 菜单是否显示
9  };
10
11  handleVisibleChange = flag =&gt; {
12    this.setState({ visible: flag });
13  };
14
15  render() {
16    const menu = (
17      &lt;Menu&gt;
18        &lt;Menu.Item key=&quot;outLogin&quot;&gt;退出登录&lt;/Menu.Item&gt;
19      &lt;/Menu&gt;
20    );
21    return (
22      &lt;Dropdown overlay={ menu } onVisibleChange={ this.handleVisibleChange } visible={ this.state.visible }&gt;
23        &lt;div className=&quot;ant-dropdown-link&quot;&gt;
24          &lt;img className=&quot;custom-img&quot; src={ customUrl } alt=&quot;&quot;/&gt;
25          &lt;Icon type=&quot;caret-down&quot; /&gt;
26        &lt;/div&gt;
27      &lt;/Dropdown&gt;
28    );
29  }
30}
31
32const HeaderBar = () =&gt; {
33  return (
34    &lt;Header&gt;
35      &lt;Breadcrumb&gt;
36        &lt;Breadcrumb.Item&gt;首页&lt;/Breadcrumb.Item&gt;
37      &lt;/Breadcrumb&gt;
38      &lt;UserInfo/&gt;
39    &lt;/Header&gt;
40  );
41};
42
43export default HeaderBar;
44

三、引入侧边栏以及头部

侧边栏以及顶部都是登录成功之后,其他页面共享的组件,由于我们把登录成功后的页面路由全部放在了routes/index.js中,所以我们接下来将上面写的2个组件在routes/index.js中引入,
routes/index.js的代码我们可以改写一下,样式写在
app.css中:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1import React from &#x27;react&#x27;;
2import {Layout} from &quot;antd&quot;;
3import { Route, Switch } from &#x27;react-router-dom&#x27;;
4import SiderBar from &quot;../components/layout/siderBar/SiderBar&quot;;
5import HeaderBar from &quot;../components/layout/header/HeaderBar&quot;;
6import Home from &#x27;../pages/home/Home&#x27;;
7import Connect from &#x27;../pages/user/connect/Connect&#x27;;
8import List from &#x27;../pages/user/list/List&#x27;;
9import Rich from &#x27;../pages/tool/rich/Rich&#x27;;
10import NotFind from &#x27;../pages/notFind/NotFind&#x27;;
11
12class Index extends React.Component{
13  render() {
14    return (
15      &lt;Layout&gt;
16        &lt;SiderBar&gt;&lt;/SiderBar&gt;
17        &lt;Layout&gt;
18          &lt;HeaderBar&gt;&lt;/HeaderBar&gt;
19          &lt;div className=&quot;layout-content&quot;&gt;
20            &lt;Switch&gt;
21              &lt;Route exact path=&quot;/&quot; component={ Home }/&gt;
22              &lt;Route path=&quot;/user/connect&quot; component={ Connect }/&gt;
23              &lt;Route path=&quot;/user/list&quot; component={ List }/&gt;
24              &lt;Route path=&quot;/tool/rich&quot; component={ Rich }/&gt;
25              &lt;Route component={ NotFind }/&gt;
26            &lt;/Switch&gt;
27          &lt;/div&gt;
28        &lt;/Layout&gt;
29      &lt;/Layout&gt;
30    );
31  }
32}
33
34export default Index;
35

写到这一步,运行我们的项目http://localhost:3000/ ,此时如果页面如下,说明我们写的代码没有问题,点击侧边栏,会发现我们的路由可以变化了,并且页面也会随着路由的变化展示不同的页面。

react + react-router + redux + ant-Desgin 搭建react管理后台 -- 页面布局(五)

 

给TA打赏
共{{data.count}}人
人已打赏
安全技术

哈希(Hash)与加密(Encrypt)的基本原理、区别及工程应用

2021-8-18 16:36:11

安全技术

C++ 高性能服务器网络框架设计细节

2022-1-11 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索