初始化

create-react-app

npx create-react-app my-app

安装 MUI

在工程路径下执行:

npm install @mui/material @emotion/react @emotion/styled
npm install @mui/material @mui/styled-engine-sc styled-components
npm install @mui/icons-material

public/index.html 中引入:

<link
  rel="stylesheet"
  href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap"
/>
<link
  rel="stylesheet"
  href="https://fonts.googleapis.com/icon?family=Material+Icons"
/>

引入一个按钮。修改 src/App.js 如下:

import './App.css';
import {Button} from "@mui/material";

function App() {
    return (
        <>
            <Button variant="contained">你好世界</Button>
        </>
    );
}

export default App;

修改 src/App.css 如下:

body {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
}

启动

npm start

如此打开 http://localhost:3000 可看到简单页面:

image-20220529170509431

跨域请求

配置跨域

npm install http-proxy-middleware

创建文件 src/setupProxy.js 如下:

const { createProxyMiddleware } = require("http-proxy-middleware");
module.exports = function (app) {
    app.use(
        createProxyMiddleware("/neutron_star_api", {
            target: "https://api.vksir.zone",
            changeOrigin: true,
            pathRewrite: {
                "^/neutron_star_api": ""
            }
        })
    )
}

配置 axios 实例

npm install axios

创建文件 src/common/requests.js 如下:

import axios from "axios";

const neutronStarAPI = axios.create({});

const baseRequest = [
    (config) => {
        config.baseURL = '/neutron_star_api/';
        return config;
    },
    (error) => {
        return Promise.reject(error);
    }
]

const baseResponse = [
    (response) => {
        return response;
    },
    (error) => {
        return Promise.reject(error);
    }
]

neutronStarAPI.interceptors.request.use(...baseRequest);
neutronStarAPI.interceptors.response.use(...baseResponse);

export {neutronStarAPI};

请求

新增一个组件 Ipv4,并增加请求函数。修改 src/App.js 如下:

import './App.css';
import {Button, TextField} from "@mui/material";
import {useState} from "react";
import {neutronStarAPI} from "./common/requests";

function App() {
    return (
        <>
            <Ipv4/>
        </>
    );
}

export default App;

function Ipv4() {
    const [ip, setIp] = useState('');

    function calc() {
        const params = new URLSearchParams();
        params.append('ip_addr', ip);
        neutronStarAPI({
            url: '/calculator/ipv4',
            params: params,
            method: 'get',
        }).then((resp) => {
            console.log(resp.data);
        });
    }

    return (
        <>
            <div>
                <TextField
                    label="IPAddress"
                    variant="outlined"
                    value={ip}
                    placeholder="192.168.10.1/24"
                    onChange={(e) => setIp(e.target.value)}/>
                <br/><br/>
                <Button variant="contained" onClick={calc}>Parse</Button>
            </div>
        </>
    );
}

效果如下:

image-20220529173049275

路由

npm install react-router-dom@6

再新增一个组件 Ipv6,编辑路由路径配置。修改 src/App.js 如下:

import './App.css';
import {Button, TextField} from "@mui/material";
import {useState} from "react";
import {neutronStarAPI} from "./common/requests";
import {BrowserRouter, Routes, Route, Navigate, Link} from "react-router-dom";

function App() {
    return (
        <>
            <BrowserRouter>
                <Link to="/calculator/ipv4">IPv4</Link>
                <span> | </span>
                <Link to="/calculator/ipv6">IPv6</Link>
                <br/><br/>
                <Routes>
                    <Route path="/" element={<Navigate to="/calculator" replace />}/>
                    <Route path="/calculator" element={<Navigate to="/calculator/ipv4" replace />}/>
                    <Route path="/calculator/ipv4" element={<Ipv4/>}/>
                    <Route path="/calculator/ipv6" element={<Ipv6/>}/>
                </Routes>
            </BrowserRouter>
        </>
    );
}

export default App;

function Ipv4() {
    const [ip, setIp] = useState('');

    function calc() {
        const params = new URLSearchParams();
        params.append('ip_addr', ip);
        neutronStarAPI({
            url: '/calculator/ipv4',
            params: params,
            method: 'get',
        }).then((resp) => {
            console.log(resp.data);
        });
    }

    return (
        <>
            <div>
                <TextField
                    label="IPv4 Address"
                    variant="outlined"
                    value={ip}
                    placeholder="192.168.10.1/24"
                    onChange={(e) => setIp(e.target.value)}/>
                <br/><br/>
                <Button variant="contained" onClick={calc}>Parse</Button>
            </div>
        </>
    );
}

function Ipv6() {
    const [ip, setIp] = useState('');

    function calc() {
        const params = new URLSearchParams();
        params.append('ip_addr', ip);
        neutronStarAPI({
            url: '/calculator/ipv6',
            params: params,
            method: 'get',
        }).then((resp) => {
            console.log(resp.data);
        });
    }

    return (
        <>
            <div>
                <TextField
                    label="IPv6 Address"
                    variant="outlined"
                    value={ip}
                    placeholder="1021::/64"
                    onChange={(e) => setIp(e.target.value)}/>
                <br/><br/>
                <Button variant="contained" onClick={calc}>Parse</Button>
            </div>
        </>
    );
}

效果如下:

image-20220529174750568


参考文档: