← 返回首页
React基础教程(二十三)
发表时间:2022-07-06 11:11:59
antd后台系统布局

antd是蚂蚁集团旗下开发的一款优秀的前端UI框架,目前这个框架支持Vue和React。这个框架主要用于开发企业级的后台产品,如果想开发移动端应用的话可以选择Ionic。

1.安装

#npm安装
npm install antd --save
#yarn安装
yarn add antd

2.实例

项目结构图如下:

package.json

"devDependencies": {
    "@babel/core": "^7.18.5",
    "@babel/plugin-transform-runtime": "^7.18.5",
    "@babel/preset-env": "^7.18.2",
    "@babel/preset-react": "^7.17.12",
    "babel-loader": "^8.2.5",
    "css-loader": "^6.7.1",
    "css-minimizer-webpack-plugin": "^4.0.0",
    "html-webpack-plugin": "^5.5.0",
    "mini-css-extract-plugin": "^2.6.1",
    "sass": "^1.52.3",
    "sass-loader": "^13.0.0",
    "style-loader": "^3.3.1",
    "terser-webpack-plugin": "^5.3.3",
    "webpack": "^5.73.0",
    "webpack-cli": "^4.10.0",
    "webpack-dev-server": "^4.9.2",
    "webpack-merge": "^5.8.0"
  },
  "dependencies": {
    "@babel/runtime": "^7.18.3",
    "antd": "^4.21.6",
    "axios": "^0.27.2",
    "react": "^16.8.0",
    "react-dom": "^16.8.0",
    "react-redux": "^5.1.2",
    "react-router-dom": "^5.2.1",
    "redux": "^4.2.0",
    "redux-thunk": "^2.4.0"
  }

Classify/index.js

import React, { Component } from 'react'
import {Table, Space,  Button} from 'antd'

const columns = [
    {
      title: '分类名称',
      dataIndex: 'name',
      key: 'name'
    },
    {
      title: '操作',
      key: 'set',
      render: (text,record,index) => {
          return (
              <Space>
                  <Button type="primary" size="small">修改</Button>
                  <Button type="primary" size="small" danger onClick={()=>{
                      alert(index)
                  }}>删除</Button>
              </Space>
          )
      }
    }
  ];

  const data = [
    {
      key: '1',
      name: '男装'
    },
    {
      key: '2',
      name: '女装'
    },
    {
      key: '3',
      name: '玩具'
    }
  ];

export default class index extends Component {
    render() {
        return (
            <Table style={{width: '100%'}} columns={columns} dataSource={data} />
        )
    }
}

Goods/index.js

import React, { Component } from 'react'

export default class index extends Component {
    render() {
        return (
            <div>
                商品管理
            </div>
        )
    }
}

User/index.js

import React, { Component } from 'react'

export default class index extends Component {
    render() {
        return (
            <div>
                用户管理
            </div>
        )
    }
}

Login.js

import React, { Component } from 'react'

export default class Login extends Component {
    render() {
        return (
            <div>
                登录
            </div>
        )
    }
}

main.css

.trigger {
    padding: 0 24px;
    font-size: 18px;
    line-height: 64px;
    cursor: pointer;
    transition: color 0.3s;
  }
.trigger:hover {
    color: #1890ff;
  }
.logo {
    height: 32px;
    margin: 16px;
    color: #fff;
    font-size: 18px;
    font-weight: bold;
    text-align: center;
  }

  .site-layout .site-layout-background {
    background: #fff;
    display: flex;
    justify-content: space-between;
  }

  .exit-btn{
      margin-right: 50px;
      cursor: pointer;
  }
  .exit-btn:hover{
      color: #37f;
  }

Main.js

import React, {Component} from 'react'
import {Layout, Menu, Table} from 'antd';
import {
    MenuUnfoldOutlined,
    MenuFoldOutlined,
    UserOutlined,
    VideoCameraOutlined,
    UploadOutlined,
    TaobaoOutlined
} from '@ant-design/icons';
import './main.css'
import {Link, Switch, Route} from 'react-router-dom';
import Classify from './Classify'
import Goods from './Goods'
import User from './User'

const {Header, Sider, Content} = Layout;

export default class Main extends Component {

    state = {
        collapsed: false
    }
    toggle = () => {
        this.setState({
            collapsed: !this.state.collapsed
        })
    }

    render() {
        // console.log(window.location.pathname)
        // console.log(this.props.location.pathname)
        return (
            <Layout style={{height: '100%'}}>
                <Sider trigger={null} collapsible collapsed={this.state.collapsed}>
                    <div className="logo">
                        {
                            this.state.collapsed ?
                                <TaobaoOutlined style={{fontSize: '30px'}}/> :
                                <span>京西电商管理系统</span>
                        }
                    </div>

                    <Menu
                        mode="inline"
                        theme="dark"
                        style={{height: '100%', borderRight: 0}}
                        items={[
                            {
                                key: '1',
                                icon: <UserOutlined/>,
                                label: `分类管理`,
                                //当点击该标签, 跳转到Home
                                to: '/classify',
                                onClick: () => {
                                    this.props.history.push({pathname: '/classify'})
                                }

                            },
                            {
                                key: '2',
                                icon: <VideoCameraOutlined/>,
                                label: '商品管理',
                                to: '/goods',
                                onClick: () => {
                                    this.props.history.push({pathname: '/goods'})
                                }
                            },
                            {
                                key: '3',
                                icon: <UploadOutlined/>,
                                label: '用户管理',
                                to: '/user',
                                onClick: () => {
                                    this.props.history.push({pathname: '/user'})
                                }
                            },
                        ]}
                    />

                </Sider>
                <Layout className="site-layout">
                    <Header className="site-layout-background" style={{padding: 0}}>
                        {React.createElement(this.state.collapsed ? MenuUnfoldOutlined : MenuFoldOutlined, {
                            className: 'trigger',
                            onClick: this.toggle,
                        })}
                        <span className="exit-btn" onClick={() => {
                            this.props.history.push({pathname: '/login'})
                        }}>退出</span>
                    </Header>
                    <Content
                        className="site-layout-background"
                        style={{
                            margin: '24px 16px',
                            padding: 24,
                            minHeight: 280,
                        }}
                    >
                        <Switch>
                            <Route path="/classify" component={Classify}/>
                            <Route path="/goods" component={Goods}/>
                            <Route path="/user" component={User}/>
                        </Switch>
                    </Content>
                </Layout>
            </Layout>
        )
    }
}

App.js

import React from 'react'
import { Route, Switch } from 'react-router-dom'
import Login from './Login'
import Main from './Main'

export default function App() {
  return (
    <Switch>
      <Route path="/login" component={Login}/>
      <Route path="/" component={Main}/>
    </Switch>
  )
}

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import 'antd/dist/antd.css';
import App from './App';
import { BrowserRouter } from 'react-router-dom';

ReactDOM.render(
  <BrowserRouter>
      <App />
  </BrowserRouter>
,document.getElementById('root'));

运行效果: