react搭配Ant Design界面模板及路由配置

接上篇文章配置出react用蚂蚁金服的环境
配置成功后:

  1. 安装路由的包:
    cnpm i react-router-dom
    使用历史记录模式

引用方式入口文件修改如下:

import {BrowserRouter as Router} from 'react-router-dom'
<Router>
<App />
</Router>, document.getElementById('root'));

配置成功后运行检查是否出错

  1. 配置withRouter
    App.js引入子组件Todo,他的配置方式如下
import {Route,NavLink,Redirect,Switch,withRouter} from 'react-router-dom'

修改导出:

export default withRouter(Todo)

配置成功后 在页面打印this.props会出现如图
在这里插入图片描述
则配置成功,withRouter作用可以监听路由变化

  1. 引入Ant Design 布局
    我引用的是官网:
    https://ant.design/components/layout-cn/#components-layout-demo-basic
    顶部-侧边布局-通栏布局:
    官网给的代码为:
import { Layout, Menu, Breadcrumb, Icon } from 'antd';

const { SubMenu } = Menu;
const { Header, Content, Sider } = Layout;

ReactDOM.render(
  <Layout>
    <Header className="header">
      <div className="logo" />
      <Menu
        theme="dark"
        mode="horizontal"
        defaultSelectedKeys={['2']}
        style={{ lineHeight: '64px' }}
      >
        <Menu.Item key="1">nav 1</Menu.Item>
        <Menu.Item key="2">nav 2</Menu.Item>
        <Menu.Item key="3">nav 3</Menu.Item>
      </Menu>
    </Header>
    <Layout>
      <Sider width={200} style={{ background: '#fff' }}>
        <Menu
          mode="inline"
          defaultSelectedKeys={['1']}
          defaultOpenKeys={['sub1']}
          style={{ height: '100%', borderRight: 0 }}
        >
          <SubMenu
            key="sub1"
            title={
              <span>
                <Icon type="user" />
                subnav 1
              </span>
            }
          >
            <Menu.Item key="1">option1</Menu.Item>
            <Menu.Item key="2">option2</Menu.Item>
            <Menu.Item key="3">option3</Menu.Item>
            <Menu.Item key="4">option4</Menu.Item>
          </SubMenu>
          <SubMenu
            key="sub2"
            title={
              <span>
                <Icon type="laptop" />
                subnav 2
              </span>
            }
          >
            <Menu.Item key="5">option5</Menu.Item>
            <Menu.Item key="6">option6</Menu.Item>
            <Menu.Item key="7">option7</Menu.Item>
            <Menu.Item key="8">option8</Menu.Item>
          </SubMenu>
          <SubMenu
            key="sub3"
            title={
              <span>
                <Icon type="notification" />
                subnav 3
              </span>
            }
          >
            <Menu.Item key="9">option9</Menu.Item>
            <Menu.Item key="10">option10</Menu.Item>
            <Menu.Item key="11">option11</Menu.Item>
            <Menu.Item key="12">option12</Menu.Item>
          </SubMenu>
        </Menu>
      </Sider>
      <Layout style={{ padding: '0 24px 24px' }}>
        <Breadcrumb style={{ margin: '16px 0' }}>
          <Breadcrumb.Item>Home</Breadcrumb.Item>
          <Breadcrumb.Item>List</Breadcrumb.Item>
          <Breadcrumb.Item>App</Breadcrumb.Item>
        </Breadcrumb>
        <Content
          style={{
            background: '#fff',
            padding: 24,
            margin: 0,
            minHeight: 280,
          }}
        >
          Content
        </Content>
      </Layout>
    </Layout>
  </Layout>,
  mountNode,
);

把对应模块引入Todo组件中 新建三个组件分别为Home,List,Myself,同理为了方便 对应的路由分别为"/home","/list","/myself",

  1. 详细思路该模板给的是三级路由,为了方便演示,我改成了2级路由,也就是12个页面,方便结果只写了三个页面,界面结果如下:
    在这里插入图片描述
    如图:创建数据
 		list:[{
                id:"sub1",
                path:"home",
                type:"user",
                key:[{
                    id:1,
                    path:"h1",
                    name:"目录1"
                },{
                    id:2,
                    path:"h2",
                    name:"目录2"
                },{
                    id:3,
                    path:"h3",
                    name:"目录3"
                },{
                    id:4,
                    path:"h4",
                    name:"目录4"
                }]
              },
              {
                id:"sub2",
                path:"list",
                type:"laptop",
                key:[{
                    id:5,
                    path:"h5",
                    name:"目录5"
                },{
                    id:6,
                    path:"h6",
                    name:"目录6"
                },{
                    id:7,
                    path:"h7",
                    name:"目录7"
                },{
                    id:8,
                    path:"h8",
                    name:"目录8"
                }]
              },
              {
                id:"sub3",
                path:"myself",
                type:"notification",
                key:[{
                    id:9,
                    path:"h9",
                    name:"目录9"
                },{
                    id:10,
                    path:"h10",
                    name:"目录10"
                },{
                    id:11,
                    path:"h11",
                    name:"目录11"
                },{
                    id:12,
                    path:"h12",
                    name:"目录12"
                }]
              }],

为路由名称以及id:
把官网重复的删除,我们进行map遍历:
todo.js代码如下

import React, { Component } from 'react'
import Home from '../home';
import List from '../list';
import Myself from '../Meself';
import { Layout, Menu, Breadcrumb, Icon } from 'antd';
import {Route,NavLink,Redirect,Switch,withRouter} from 'react-router-dom'
const { SubMenu } = Menu;
const { Header, Content, Sider } = Layout;
class Todo extends Component {
    constructor(props){
        super(props)
        this.state={
            list:[{
                id:"sub1",
                path:"home",
                type:"user",
                key:[{
                    id:1,
                    path:"h1",
                    name:"目录1"
                },{
                    id:2,
                    path:"h2",
                    name:"目录2"
                },{
                    id:3,
                    path:"h3",
                    name:"目录3"
                },{
                    id:4,
                    path:"h4",
                    name:"目录4"
                }]
              },
              {
                id:"sub2",
                path:"list",
                type:"laptop",
                key:[{
                    id:5,
                    path:"h5",
                    name:"目录5"
                },{
                    id:6,
                    path:"h6",
                    name:"目录6"
                },{
                    id:7,
                    path:"h7",
                    name:"目录7"
                },{
                    id:8,
                    path:"h8",
                    name:"目录8"
                }]
              },
              {
                id:"sub3",
                path:"myself",
                type:"notification",
                key:[{
                    id:9,
                    path:"h9",
                    name:"目录9"
                },{
                    id:10,
                    path:"h10",
                    name:"目录10"
                },{
                    id:11,
                    path:"h11",
                    name:"目录11"
                },{
                    id:12,
                    path:"h12",
                    name:"目录12"
                }]
              }],
              sub:"sub1",
              keys:"1"
        }
    }
    change(sub,id){
        console.log(sub,id)
        this.setState({
            sub:sub,
            keys:id
        })
    }
    render() {
        return (
            <div>
                  <Layout>
                    <Header className="header">
                    <div className="logo" />
                    <Menu
                        theme="dark"
                        mode="horizontal"
                        defaultSelectedKeys={['1']}
                        style={{ lineHeight: '64px' }}
                    >
                        <Menu.Item key="1">工作系统</Menu.Item>
                    </Menu>
                    </Header>
                    <Layout>
                    <Sider width={200} style={{ background: '#fff' }}>
                        <Menu
                        mode="inline"
                        defaultSelectedKeys={[this.state.keys]}
                        defaultOpenKeys={[this.state.sub]}
                        style={{ height: '100%', borderRight: 0 }}
                        >
                        {
                            this.state.list.map((item)=>{
                            return <SubMenu
                                    key={item.id}
                                    title={
                                        <NavLink to={"/"+item.path+"/"+item.key[0].path}>
                                        <span style={{display:"block"}}>
                                        <Icon type="user" />
                                        {item.path}
                                        </span>
                                        </NavLink>
                                    }
                                    >
                                        {
                                            item.key.map((it)=>{
                                                return <Menu.Item key={it.id} onClick={this.change.bind(this,item.id,it.id)}><NavLink to={"/"+item.path+"/"+it.path}>{it.name}</NavLink></Menu.Item>
                                            })
                                        }
                                    </SubMenu>
                            })
                        }
                        </Menu>
                    </Sider>
                    <Layout style={{ padding: '0 24px 24px' }}>
                        <Breadcrumb style={{ margin: '16px 0' }}>
                        <Breadcrumb.Item>{this.props.location.pathname.split("/")[1]}</Breadcrumb.Item>
                        <Breadcrumb.Item>{this.props.location.pathname.split("/")[2]}</Breadcrumb.Item>
                        </Breadcrumb>
                        <Content
                        style={{
                            background: '#fff',
                            padding: 24,
                            margin: 0,
                            minHeight: 280,
                        }}
                        >
                        <Switch>
                            <Route path="/home" component={Home}/>
                            <Route path="/list"  component={List}/>
                            <Route path="/myself"  component={Myself}/>
                            <Redirect from="/home" to="/home/h1"/>
                            <Redirect from="/list" to="/list/h1"/>
                            <Redirect from="/myself" to="/myself/h1"/>
                            <Redirect from="/" to="/home/h1" exact/>
                        </Switch>
                        </Content>
                    </Layout>
                    </Layout>
                </Layout>,
            </div>
        )
    }
}
export default withRouter(Todo)

解释如下:
在这里插入图片描述
在这里插入图片描述
运行结果:
在这里插入图片描述

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值