react+babel+webpack熱編譯+antd+router開發教程

react+babel+webpack熱編譯+antd+router開發教程

1、初始化工程目錄

mkdir demo && cd demo
npm init --yes

2、安裝依賴(此過程比較長,建議更換國內源)

npm i -D webpack webpack-cli @babel/core babel-loader @babel/preset-env @babel/preset-react react react-dom prop-types html-webpack-plugin html-loader webpack-dev-server @babel/plugin-proposal-class-properties antd css-loader style-loader react-router react-router-dom

3、配置babel和webpack

新建.babelrc文件

{
"presets": ["@babel/preset-env", "@babel/preset-react"],
"plugins": ["@babel/plugin-proposal-class-properties"]
}

新建webpack.config.js文件

const HtmlWebPackPlugin = require("html-webpack-plugin");

module.exports = {
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: {
          loader: "babel-loader"
        }
      },
      {
        test: /\.html$/,
        use: [
          {
            loader: "html-loader"
          }
        ]
      },
      {
        test: /\.css$/,
        use: [
          {
            loader: "style-loader"
          },
          {
            loader: "css-loader"
          }
        ]
      }
    ]
  },
  plugins: [
    new HtmlWebPackPlugin({
      template: "./src/index.html",
      filename: "./index.html"
    })
  ]
  //devtool: 'eval',//最快
  //devtool: 'inline-cheap-module-source-map', //僅限行
  devtool: 'eval-source-map', //原始
};

package.json文件scripts內增加腳本

"scripts": {
    "build": "webpack --mode production",
    "start": "webpack-dev-server --open --mode development",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

4、編寫代碼

新建src目錄
新建src/index.css文件

.logo {
  height: 32px;
  background: rgba(255, 255, 255, 0.2);
  margin: 16px;
}
.ant-layout-sider-trigger  .anticon {
  margin-top: 18px;
}
.ant-table-pagination  .anticon {
  margin-top: 10px;
}

新建src/index.html文件

<div id="container" style="padding: 24px"></div>
<script>
  var mountNode = document.getElementById('container');
</script>

新建src/index.js文件

import "./index.css";
import Demo from "./container/main.jsx";

新建src/container目錄
新建src/container/main.jsx文件

import React from "react";
import ReactDOM from "react-dom";
import "antd/dist/antd.css";
import { Layout, Breadcrumb } from "antd";
import { HashRouter  , Route,} from "react-router-dom";
import MyHeader from "./header.jsx"
import MyTable from "./table.jsx"
import MyMenu from "./menu.jsx"
const { Header, Content, Footer, Sider } = Layout;

const Home = () =>(
  <div>
    <h2>Home</h2>
  </div>
);

class Demo extends React.Component {
  state = {
    collapsed: false,
  };

  onCollapse = collapsed => {
    console.log(collapsed);
    this.setState({ collapsed });
  };

  render() {
    return (
      <Layout style={{ minHeight: "100vh" }}>
        <Sider collapsible collapsed={this.state.collapsed} onCollapse={this.onCollapse}>
          <div className="logo" />
          <MyMenu/>
        </Sider>
        <Layout>
          <Header style={{ background: "#fff", padding: 0 }} >
            <MyHeader/>
          </Header>
          <Content style={{ margin: "0 16px"}}>
            <Breadcrumb style={{ margin: "16px 0" }}>
              <Breadcrumb.Item>User</Breadcrumb.Item>
              <Breadcrumb.Item>Bill</Breadcrumb.Item>
            </Breadcrumb>
            <div style={{ padding: 24, background: "#fff", minHeight: 360,height:"100%" }}>
              <Route exact path="/" component={Home} />
              <Route exact path="/table/:id" component={MyTable} />
            </div>
          </Content>
          <Footer style={{ textAlign: "center" }}>
            footer text
          </Footer>
        </Layout>
      </Layout>
    );
  }
}

ReactDOM.render(
  <HashRouter ><Demo /></HashRouter >
, document.getElementById("container"));

新建src/container/header.jsx文件

import React from "react";
import { PageHeader, Button, Tag} from "antd";

class MyHeader extends React.Component {
    render() {
        return (
            <PageHeader
                title="Title"
                subTitle="This is a subtitle"
                tags={<Tag color="blue">Running</Tag>}
                extra={[
                <Button key="3">Operation</Button>,
                <Button key="2">Operation</Button>,
                <Button key="1" type="primary">
                    Primary
                </Button>,
                ]}
                avatar={{ src: "https://avatars1.githubusercontent.com/u/8186664?s=460&v=4" }}
            >
            </PageHeader>
        );
    }
}
export default MyHeader

新建src/container/menu.jsx文件

import React from "react";
import { Layout, Menu, Icon } from "antd";
import {  NavLink ,withRouter} from "react-router-dom";
const { SubMenu } = Menu;

const LeftMenu=withRouter(({history}) => {
    return (
        <Menu theme="dark" mode="inline"
      selectedKeys={[history.location.pathname]}
      >
        <Menu.Item key="/" >
          <NavLink to="/">
          <Icon type="pie-chart" />
          <span>Option 1</span>
          </NavLink>
        </Menu.Item>
        <Menu.Item key="/table/1">
          <NavLink to="/table/1">
          <Icon type="desktop" />
          <span>Option 2</span>
          </NavLink>
        </Menu.Item>
        <SubMenu
          key="sub1"
          title={
            <span>
              <Icon type="user" />
              <span>User</span>
            </span>
          }
        >
          <Menu.Item key="3">Tom</Menu.Item>
          <Menu.Item key="4">Bill</Menu.Item>
          <Menu.Item key="5">Alex</Menu.Item>
        </SubMenu>
        <SubMenu
          key="sub2"
          title={
            <span>
              <Icon type="team" />
              <span>Team</span>
            </span>
          }
        >
          <Menu.Item key="6">Team 1</Menu.Item>
          <Menu.Item key="8">Team 2</Menu.Item>
        </SubMenu>
        <Menu.Item key="9">
          <Icon type="file" />
          <span>File</span>
        </Menu.Item>
      </Menu>
    );
})

class MyMenu extends React.Component {
    render() {
        return (
            <LeftMenu/>
        );
    }
}
export default withRouter(MyMenu)

新建src/container/table.jsx文件

import React from "react";
import { Table, Divider, Tag } from "antd";

const columns = [
  {
    title: "Name",
    dataIndex: "name",
    key: "name",
    render: text => <a>{text}</a>,
  },
  {
    title: "Age",
    dataIndex: "age",
    key: "age",
  },
  {
    title: "Address",
    dataIndex: "address",
    key: "address",
  },
  {
    title: "Tags",
    key: "tags",
    dataIndex: "tags",
    render: tags => (
      <span>
        {tags.map(tag => {
          let color = tag.length > 5 ? "geekblue" : "green";
          if (tag === "loser") {
            color = "volcano";
          }
          return (
            <Tag color={color} key={tag}>
              {tag.toUpperCase()}
            </Tag>
          );
        })}
      </span>
    ),
  },
  {
    title: "Action",
    key: "action",
    render: (text, record) => (
      <span>
        <a>Invite {record.name}</a>
        <Divider type="vertical" />
        <a>Delete</a>
      </span>
    ),
  },
];


class MyTable extends React.Component {
    //構造函數
    constructor(props) {
        super(props);
        this.state = {
            id: props.match.params.id
          }
    }
    getData(){
        console.log(this.state.id);
        this.state.data = [
            {
              key: "1",
              name: "John Brown",
              age: 32,
              address: "New York No. 1 Lake Park",
              tags: ["nice", "developer"],
            },
            {
              key: "2",
              name: "Jim Green",
              age: 42,
              address: "London No. 1 Lake Park",
              tags: ["loser"],
            },
            {
              key: "3",
              name: "Joe Black",
              age: 32,
              address: "Sidney No. 1 Lake Park",
              tags: ["cool", "teacher"],
            },
          ];
    }


    

    //掛載組件方法
    componentDidMount(){

    }

    //銷燬組件方法
    componentWillUnmount(){

    }
    render() {
        this.getData();
        return (
            <Table
            bordered
            columns={columns} dataSource={this.state.data} />
        );
    }
}
export default MyTable

5、啓動項目

npm start
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章