从零搭建React项目框架与基本封装

一、安装与使用

1、全局安装create-react-app

npm install -g create-react-app

2、创建项目

(your-app)项目名称,注意命名方式

create-react-app your-app 

出现以下界面代表成功

在这里插入图片描述
进入项目,项目初始目录结构如下
在这里插入图片描述
在src目录下新建以下目录
其中:api:用来存放调用后台接口的方法;request:是axios 的封装;store:是reducx存放的地方;view:是我们的功能页面;当然还需要建uitl等包,这里基础搭建用不上~

在这里插入图片描述
执行 npm install(安装项目所需依赖)
执行npm run start 启动项目
出现如下界面表示启动成功
在这里插入图片描述

在这里插入图片描述

二、UI框架安装

这里本人选择的 Ant Design
安装命令

npm install antd

这里 antd 采采用按需引入方式;示例如下:

import React, {useEffect, useState} from "react";
//antd按需引入
import {Button, Form, Input, message, Modal, Select} from "antd";
import {queryRoleList, addOrEditUserList} from '../../../api/user/userApi'

export default function AddOrEditForm(props) {
    const {Option} = Select;
    const [form] = Form.useForm();
    const {title, record, open, close} = props
    const [roleList, setroleList] = useState([])
    const handleCancel = () => {
        close()
    }
    const onFinish = (values) => {
        console.log('Success:', values);
        if (title === "新增") {
            let portalRoleList = values.portalRoleList.map(ele => {
                return {
                    ROLE_ID: ele
                }
            })

            let params = {
                ...values,
                "portalRoleList": portalRoleList
            }
            addOrEditUserList(params).then(res => {
                if (res.code === 200) {
                    message.success("新增成功")
                    handleCancel()
                }
            })

        } else {
            let portalRoleList = values.portalRoleList.map(ele => {
                return {
                    ROLE_ID: ele
                }
            })
            let params = {
                ...values,
                "portalRoleList": portalRoleList,
                userId: record.userId
            }
            addOrEditUserList(params).then(res => {
                if (res.code === 200) {
                    message.success("编辑成功")
                    handleCancel()
                }
            })
        }
    };
    const onFinishFailed = (errorInfo) => {
        console.log('Failed:', errorInfo);
    };
    const queryRole = () => {
        queryRoleList().then(res => {
            if (res.code === 200) {
                setroleList(res.data)
            }
        })

    }
    useEffect(() => {
        if (open) {
            queryRole()
            let portalRoleList = record.portalRoleList.map(ele => {
                return ele.ROLE_ID
            })
            let valeus = {
                ...record,
                "portalRoleList": portalRoleList
            }
            form.setFieldsValue(valeus)
        }
    }, [open, form, record])

    return (<div>
        <Modal title={title} open={open} onCancel={handleCancel} footer={null}>
            <Form
                form={form}
                name="basic"
                labelCol={{
                    span: 8,
                }}
                wrapperCol={{
                    span: 16,
                }}
                onFinish={onFinish}
                onFinishFailed={onFinishFailed}
                autoComplete="off"
            >
                <Form.Item
                    label="用户名"
                    name="userName"
                    rules={[
                        {
                            required: true,
                            message: '请输入用户名',
                        },
                    ]}
                >
                    <Input/>
                </Form.Item>
                <Form.Item
                    label="姓名"
                    name="name"
                    rules={[
                        {
                            required: true,
                            message: '请输入姓名',
                        },
                    ]}
                >
                    <Input/>
                </Form.Item>

                <Form.Item
                    label="邮箱"
                    name="email"
                    rules={[
                        {
                            required: true,
                            message: '请输入邮箱',
                        },
                    ]}
                >
                    <Input/>
                </Form.Item>
                <Form.Item
                    label="电话"
                    name="phone"
                    rules={[
                        {
                            required: true,
                            message: '请输入电话',
                        },
                    ]}
                >
                    <Input/>
                </Form.Item>
                <Form.Item
                    label="所属角色"
                    name="portalRoleList"
                    rules={[
                        {
                            required: true,
                            message: '请选择所属角色',
                        },
                    ]}
                >
                    <Select
                        mode="multiple"
                        style={{
                            width: 120,
                        }}
                    >
                        {roleList.map((ele, index) => {
                            return <Option key={index} value={ele.ROLE_ID}>{ele.ROLE_NAME}</Option>
                        })}

                    </Select>
                </Form.Item>
                <Form.Item
                    wrapperCol={{
                        offset: 8,
                        span: 16,
                    }}
                >
                    <Button onClick={handleCancel} style={{marginRight: 15}}>取消</Button>
                    <Button type="primary" htmlType="submit">
                        确认
                    </Button>
                </Form.Item>
            </Form>
        </Modal>
    </div>)
}

三、封装axios

可以参考博主这篇文章,封装稍作修改UI即可

四、路由

1、安装命令

npm install react-router-dom

2、修改index.js文件中内容

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

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

3、src下创建路由配置文件routes.js

import Index from './view/index/Index'
import User from './view/User/Index'

const routes=[
    {
        title:"首页",
        path:"/index",
        element:Index
    },
    {
        title:"用户管理",
        path:"/user",
        element:User
    }
]
export default routes

4、修改App.js文件中内容

import { Routes, Route} from 'react-router-dom'
//登录页面
import Login from '../src/view/login/Login'
import routes from "./routes";
//布局页面
import LayoutIndex from './view/Layout/LayoutIndex'
function App () {
  return (
      <Routes>
        <Route path='/' element={<LayoutIndex/>}>
          {
            routes.map((ele,index)=>{
              let Element = ele.element
              return (<Route key={ index } path={ele.path} element={ <Element/>}></Route>)
            })
          }
        </Route>
        <Route path='/login' element={<Login />}></Route>
      </Routes>
  );
}
export default App;

5、创建页面布局组件与菜单组件

页面布局组件-LayoutIndex.jsx

其中Outlet 非常关键相当于vue中的router-view

import React from 'react'
import {Layout} from 'antd';
import LayoutMenu from './LayoutMenu'
import { Outlet } from 'react-router-dom'
const {Header, Sider, Content} = Layout;
export default function LayoutIndex() {
    return (
        <Layout style={{width: "100%", height: "100%"}}>
            <Header>
                <div style={{color:"white"}}>
                    智慧物业系统
                </div>

            </Header>
            <Layout>
                <Sider>
                    <LayoutMenu></LayoutMenu>
                </Sider>
                <Content style={{padding:5}}>
                    <Outlet/>
                </Content>
            </Layout>
        </Layout>
    )

}


右侧菜单组件-LayoutMenu.jsx

import React from "react";
import {Menu} from "antd";
import {Link} from "react-router-dom";
import routes from "../../routes";

export  default  function LayoutMenu(){
    return(<div>
        <Menu
            style={{
                width: 200,
                height:600
            }}
            mode="inline">
            {
                routes.map((ele,index)=>{
                    return (<Menu.Item className="Item" key={index}> <Link key={index} to={ele.path}>{ele.title}</Link></Menu.Item>)
                })
            }

        </Menu>
    </div>)
}

效果图如下:
在这里插入图片描述
最后附上源码链接:https://pan.baidu.com/s/1_5O70aIKBFvVJYNBiVVwoQ?pwd=6n1x
提取码:6n1x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值