一、安装与使用
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
四、路由
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