【共享单车】—— React后台管理系统开发手记:员工管理之增删改查
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录。最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star。

一、创建员工表单子组件
- 创建员工、编辑员工、员工详情、删除员工共用一个Modal弹框表单
<Modal
title={this.state.title}
visible={this.state.isVisible}
onOk={this.handleSubmit}
onCancel={() => {
this.userForm.props.form.resetFields();
this.setState({
isVisible: false
})
}}
width={600}
{...footer}
>
<UserForm type={this.state.type} userInfo={this.state.userInfo} wrappedComponentRef={(inst) => {this.userForm = inst;}}/>
</Modal> - 创建、编辑员工提交:共用handleSubmit(),判断type,通过axios.ajax()调用不同的Easy Mock数据接口请求
//创建编辑员工提交
handleSubmit = () => {
let type = this.state.types;
let data = this.userForm.props.form.getFieldsValue();
axios.ajax({
url: type=='create'?'/user/add':'/user/edit',
data: {
params: data
}
}).then((res) => {
if(res.code === 0){
this.userForm.props.form.resetFields();
this.setState({
isVisible: false
})
this.requestList();
}
})
} - 关键:
- getFieldDecorator实现表单数据双向绑定
const {getFieldDecorator} = this.props.form; - 获取this.props.userInfo:【编辑员工】中设置表单默认数据、【员工信息】中显示员工信息
- 判断this.props.type:当type == 'detail'时,直接渲染员工信息userInfo,不再渲染Form表单
- 判断this.state.type:当type == 'detail'时,不显示Modal的footer按钮
let footer = {};
if(this.state.type == 'detail'){
footer = {
footer: null
}
}
- 组件实现
//子组件:创建员工表单
class UserForm extends React.Component{ getState = (state) => {
let config = {
'1':'咸鱼一条',
'2':'风华浪子',
'3':'北大才子一枚',
'4':'百度FE',
'5':'创业者'
}
return config[state];
} render(){
let type = this.props.type;
let userInfo = this.props.userInfo || {};
const {getFieldDecorator} = this.props.form;
const formItemLayout= {
labelCol:{span: 5},
wrapperCol:{span: 19}
}
return (
<Form layout="horizontal">
<FormItem label="用户名" {...formItemLayout}>
{
type == 'detail' ? userInfo.userName :
getFieldDecorator('user_name',{
initialValue: userInfo.userName
})(
<Input type="text" placeholder="请输入用户名"/>
)
}
</FormItem>
<FormItem label="性别" {...formItemLayout}>
{
type == 'detail' ? userInfo.sex == 1 ? '男' : '女' :
getFieldDecorator('sex',{
initialValue: userInfo.sex
})(
<RadioGroup>
<Radio value={1}>男</Radio>
<Radio value={2}>女</Radio>
</RadioGroup>
)
}
</FormItem>
<FormItem label="状态" {...formItemLayout}>
{
type == 'detail' ? this.getState(userInfo.state) :
getFieldDecorator('state',{
initialValue: userInfo.state
})(
<Select>
<Option value={1}>咸鱼一条</Option>
<Option value={2}>风华浪子</Option>
<Option value={3}>北大才子一枚</Option>
<Option value={4}>百度FE</Option>
<Option value={5}>创业者</Option>
</Select>
)
}
</FormItem>
<FormItem label="生日" {...formItemLayout}>
{
type == 'detail' ? userInfo.birthday :
getFieldDecorator('birthday',{
initialValue: moment(userInfo.birthday)
})(
<DatePicker format="YYYY-MM-DD"/>
)
}
</FormItem>
<FormItem label="联系地址" {...formItemLayout}>
{
type == 'detail' ? userInfo.address :
getFieldDecorator('address',{
initialValue: userInfo.address
})(
<TextArea rows={3} placeholder="请输入联系地址"/>
)
}
</FormItem>
</Form>
)
}
}
UserForm = Form.create({})(UserForm);
二、功能区操作
- 创建员工、编辑员工、员工详情、删除员工共用一个功能操作函数handleOperate()
<Card style={{marginTop:10}} className="operate-wrap">
<Button type="primary" icon="plus" onClick={() => this.handleOperate('create')}>创建员工</Button>
<Button type="primary" icon="edit" onClick={() => this.handleOperate('edit')}>编辑员工</Button>
<Button type="primary" onClick={() => this.handleOperate('detail')}>员工详情</Button>
<Button type="primary" icon="delete" onClick={() => this.handleOperate('delete')}>删除员工</Button>
</Card> 关键:传入不同的参数[type],通过判断type的值,执行不同的操作
//功能区操作
handleOperate = (type) => {
let item = this.state.selectedItem;
if(type == 'create'){
this.setState({
type,
isVisible: true,
title: '创建员工'
})
}else if(type == 'edit'){
if(!item){
Modal.info({
title: '提示',
content: '请选择一个用户'
})
return;
}
this.setState({
type,
isVisible: true,
title: '编辑员工',
userInfo: item
})
}else if(type == 'detail'){
if(!item){
Modal.info({
title: '提示',
content: '请选择一个用户'
})
return;
}
this.setState({
type,
isVisible: true,
title: '员工详情',
userInfo: item
})
}else if(type == 'delete'){
if(!item){
Modal.info({
title: '提示',
content: '请选择一个用户'
})
return;
}
let _this = this;
Modal.confirm({
title: '确认删除',
content: `是否要删除当前选中的员工${item.id}`,
onOk(){
axios.ajax({
url: '/user/delete',
data: {
params: {
id: item.id
}
}
}).then((res) => {
if(res.code === 0){
_this.setState({
isVisible: false
})
_this.requestList();
}
})
}
})
}
}实例代码:
import React from 'react'
import {Card, Button, Form, Input, Select,Radio, Icon, Modal, DatePicker} from 'antd'
import axios from './../../axios'
import Utils from './../../utils/utils'
import BaseForm from './../../components/BaseForm'
import ETable from './../../components/ETable'
import moment from 'moment'
const FormItem = Form.Item;
const RadioGroup = Radio.Group;
const TextArea = Input.TextArea;
const Option = Select.Option; export default class User extends React.Component{ state = {
list:[],
isVisible: false
} params = {
page: 1
} formList = [
{
type: 'INPUT',
label: '用户名',
field: 'user_name',
placeholder: '请输入名称',
width: 130
},
{
type: 'INPUT',
label: '手机号',
field: 'user_mobile',
placeholder: '请输入手机号',
width: 130
},
{
type: 'DATE',
label: '入职日期',
field: 'user_date',
placeholder: '请输入日期'
}
] componentDidMount(){
this.requestList();
} handleFilter = (params) => {
this.params = params;
this.requestList();
} requestList = () => {
axios.requestList(this, '/table/list1', this.params);
} //功能区操作
handleOperate = (type) => {
let item = this.state.selectedItem;
if(type == 'create'){
this.setState({
type,
isVisible: true,
title: '创建员工'
})
}else if(type == 'edit'){
if(!item){
Modal.info({
title: '提示',
content: '请选择一个用户'
})
return;
}
this.setState({
type,
isVisible: true,
title: '编辑员工',
userInfo: item
})
}else if(type == 'detail'){
if(!item){
Modal.info({
title: '提示',
content: '请选择一个用户'
})
return;
}
this.setState({
type,
isVisible: true,
title: '员工详情',
userInfo: item
})
}else if(type == 'delete'){
if(!item){
Modal.info({
title: '提示',
content: '请选择一个用户'
})
return;
}
let _this = this;
Modal.confirm({
title: '确认删除',
content: `是否要删除当前选中的员工${item.id}`,
onOk(){
axios.ajax({
url: '/user/delete',
data: {
params: {
id: item.id
}
}
}).then((res) => {
if(res.code === 0){
_this.setState({
isVisible: false
})
_this.requestList();
}
})
}
})
}
} //创建编辑员工提交
handleSubmit = () => {
let type = this.state.types;
let data = this.userForm.props.form.getFieldsValue();
axios.ajax({
url: type=='create'?'/user/add':'/user/edit',
data: {
params: data
}
}).then((res) => {
if(res.code === 0){
this.userForm.props.form.resetFields();
this.setState({
isVisible: false
})
this.requestList();
}
})
} render(){
const columns = [{
title: 'id',
dataIndex: 'id'
}, {
title: '用户名',
dataIndex: 'userName'
}, {
title: '性别',
dataIndex: 'sex',
render(sex){
return sex ==1 ?'男':'女'
}
}, {
title: '状态',
dataIndex: 'state',
render(state){
let config = {
'1':'咸鱼一条',
'2':'风华浪子',
'3':'北大才子一枚',
'4':'百度FE',
'5':'创业者'
}
return config[state];
}
},{
title: '婚姻',
dataIndex: 'isMarried',
render(isMarried){
return isMarried == 1 ?'已婚':'未婚'
}
},{
title: '生日',
dataIndex: 'birthday'
},{
title: '联系地址',
dataIndex: 'address'
},{
title: '早起时间',
dataIndex: 'time'
}
]; let footer = {};
if(this.state.type == 'detail'){
footer = {
footer: null
}
} return (
<div>
<Card>
<BaseForm formList={this.formList} filterSubmit={this.handleFilter}/>
</Card>
<Card style={{marginTop:10}} className="operate-wrap">
<Button type="primary" icon="plus" onClick={() => this.handleOperate('create')}>创建员工</Button>
<Button type="primary" icon="edit" onClick={() => this.handleOperate('edit')}>编辑员工</Button>
<Button type="primary" onClick={() => this.handleOperate('detail')}>员工详情</Button>
<Button type="primary" icon="delete" onClick={() => this.handleOperate('delete')}>删除员工</Button>
</Card>
<div className="content-wrap">
<ETable
columns={columns}
updateSelectedItem={Utils.updateSelectedItem.bind(this)}
selectedRowKeys={this.state.selectedRowKeys}
selectedItem={this.state.selectedItem}
dataSource={this.state.list}
pagination={this.state.pagination}
/>
</div>
<Modal
title={this.state.title}
visible={this.state.isVisible}
onOk={this.handleSubmit}
onCancel={() => {
this.userForm.props.form.resetFields();
this.setState({
isVisible: false
})
}}
width={600}
{...footer}
>
<UserForm type={this.state.type} userInfo={this.state.userInfo} wrappedComponentRef={(inst) => {this.userForm = inst;}}/>
</Modal>
</div>
)
}
} //子组件:创建员工表单
class UserForm extends React.Component{ getState = (state) => {
let config = {
'1':'咸鱼一条',
'2':'风华浪子',
'3':'北大才子一枚',
'4':'百度FE',
'5':'创业者'
}
return config[state];
} render(){
let type = this.props.type;
let userInfo = this.props.userInfo || {};
const {getFieldDecorator} = this.props.form;
const formItemLayout= {
labelCol:{span: 5},
wrapperCol:{span: 19}
}
return (
<Form layout="horizontal">
<FormItem label="用户名" {...formItemLayout}>
{
type == 'detail' ? userInfo.userName :
getFieldDecorator('user_name',{
initialValue: userInfo.userName
})(
<Input type="text" placeholder="请输入用户名"/>
)
}
</FormItem>
<FormItem label="性别" {...formItemLayout}>
{
type == 'detail' ? userInfo.sex == 1 ? '男' : '女' :
getFieldDecorator('sex',{
initialValue: userInfo.sex
})(
<RadioGroup>
<Radio value={1}>男</Radio>
<Radio value={2}>女</Radio>
</RadioGroup>
)
}
</FormItem>
<FormItem label="状态" {...formItemLayout}>
{
type == 'detail' ? this.getState(userInfo.state) :
getFieldDecorator('state',{
initialValue: userInfo.state
})(
<Select>
<Option value={1}>咸鱼一条</Option>
<Option value={2}>风华浪子</Option>
<Option value={3}>北大才子一枚</Option>
<Option value={4}>百度FE</Option>
<Option value={5}>创业者</Option>
</Select>
)
}
</FormItem>
<FormItem label="生日" {...formItemLayout}>
{
type == 'detail' ? userInfo.birthday :
getFieldDecorator('birthday',{
initialValue: moment(userInfo.birthday)
})(
<DatePicker format="YYYY-MM-DD"/>
)
}
</FormItem>
<FormItem label="联系地址" {...formItemLayout}>
{
type == 'detail' ? userInfo.address :
getFieldDecorator('address',{
initialValue: userInfo.address
})(
<TextArea rows={3} placeholder="请输入联系地址"/>
)
}
</FormItem>
</Form>
)
}
}
UserForm = Form.create({})(UserForm);
注:项目来自慕课网
【共享单车】—— React后台管理系统开发手记:员工管理之增删改查的更多相关文章
- 【共享单车】—— React后台管理系统开发手记:主页面架构设计
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- 【共享单车】—— React后台管理系统开发手记:Redux集成开发
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- 【共享单车】—— React后台管理系统开发手记:项目工程化开发
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- 【共享单车】—— React后台管理系统开发手记:城市管理和订单管理
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- 【共享单车】—— React后台管理系统开发手记:AntD Form基础组件
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- 【共享单车】—— React后台管理系统开发手记:Router 4.0路由实战演练
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- 【共享单车】—— React后台管理系统开发手记:权限设置和菜单调整(未完)
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- 【共享单车】—— React后台管理系统开发手记:AntD Table高级表格
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
- 【共享单车】—— React后台管理系统开发手记:AntD Table基础表格
前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...
随机推荐
- c语言数组传递
转自:http://blog.csdn.net/xgmiao/article/details/9570825 点击打开链接 数组作为函数实参: C语言中数组作为函数实参时,编译器总是将其解析为指向数组 ...
- [USACO06NOV]玉米田Corn Fields (状压$dp$)
题目链接 Solution 状压 \(dp\) . \(f[i][j][k]\) 代表前 \(i\) 列中 , 已经安置 \(j\) 块草皮,且最后一位状态为 \(k\) . 同时多记录一个每一列中的 ...
- confluence6.3安装、破解
confluence是一个专业的企业知识管理与协同软件,可以用于构建企业wiki.通过它可以实现团队成员之间的协作和知识共享.现在大多数公司都会部署一套confluence,用作内部wiki.现在co ...
- Registering RHEL6 Clients into spacewalk
Before Starting(login to spacwalk server) 1.Create a base channel within Spacewalk (Channels > Ma ...
- cpj-swagger分别整合struts2、spring mvc、servlet
cpj-swagger 原文地址:https://github.com/3cpj/swagger 1. Swagger是什么? 官方说法:Swagger是一个规范和完整的框架,用于生成.描述.调用和可 ...
- SJCL:斯坦福大学JS加密库
斯坦福大学Javascript加密库简称SJCL,是一个由斯坦福大学计算机安全实验室创立的项目,旨在创建一个安全.快速.短小精悍.易使用.跨浏览器的JavaScript加密库.(斯坦福大学下载地址:h ...
- OPEN SUSE LINUX
1. 把中文界面变成英文界面 yast2->system->language: 主要语言: 美式英语US 2. 使用root用户默认登录 Ubuntu使用root登录 Ubu ...
- opengl glEnableClientState() 和 glDisableClientState() 作用
http://zhidao.baidu.com/link?url=c3m55lgpjhU1Rb7TEP-aTGQAX3-GrcBk5NaUC2UA1ZtQiCCtHJzB_KoG7pWvPEybfYv ...
- django获取请求参数
1.获取URL路径中的参数 需求:假设用户访问127.0.0.1/user/1/2,你想获取1,2.应该怎么操作呢? (1)未命名参数(位置参数) # 在项目下的urls.py下增加设置: url(r ...
- Request的Body只能读取一次解决方法
一.需要一个类继承HttpServletRequestWrapper,该类继承了ServletRequestWrapper并实现了HttpServletRequest, 因此它可作为request在F ...