前言:以下内容基于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();
    }
    })
    }    
  • 关键:
  1. getFieldDecorator实现表单数据双向绑定

     const {getFieldDecorator} = this.props.form;  
  2. 获取this.props.userInfo:【编辑员工】中设置表单默认数据、【员工信息】中显示员工信息
  3. 判断this.props.type:当type == 'detail'时,直接渲染员工信息userInfo,不再渲染Form表单
  4. 判断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后台管理系统开发手记:员工管理之增删改查的更多相关文章

  1. 【共享单车】—— React后台管理系统开发手记:主页面架构设计

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  2. 【共享单车】—— React后台管理系统开发手记:Redux集成开发

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  3. 【共享单车】—— React后台管理系统开发手记:项目工程化开发

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  4. 【共享单车】—— React后台管理系统开发手记:城市管理和订单管理

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  5. 【共享单车】—— React后台管理系统开发手记:AntD Form基础组件

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  6. 【共享单车】—— React后台管理系统开发手记:Router 4.0路由实战演练

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  7. 【共享单车】—— React后台管理系统开发手记:权限设置和菜单调整(未完)

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  8. 【共享单车】—— React后台管理系统开发手记:AntD Table高级表格

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

  9. 【共享单车】—— React后台管理系统开发手记:AntD Table基础表格

    前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. ...

随机推荐

  1. js常用数组去重

    // ES6 function unique (arr){ const seen = new Map() return arr.filter((a) => !seen.has(a) && ...

  2. 《R语言实战》读书笔记--第四章 基本数据管理

    本章内容: 操纵日期和缺失值 熟悉数据类型的转换 变量的创建和重编码 数据集的排序,合并与取子集 选入和丢弃变量 多说一句,数据预处理的时间是最长的……确实是这样的,额. 4.1一个示例 4.2创建新 ...

  3. JNDI连接数据库的详细步骤 以及简要的c3po数据库连接的配置

    第一步在tomcat的context.xml文件中配置数据源:context.xml的路径形式是:D:\Program Files (x86)\apache-tomcat-6.0.44\conf\co ...

  4. HTTP Basic 机制

    package com.enation.app.shop.component.payment.plugin.cod; import java.io.IOException; import java.u ...

  5. javascript 中 click 和onclick有什么区别呢

    <script type="text/javascript"> $(function(){ $("#btn4").click(function(){ ...

  6. JS省份联级下拉框

    <script type="text/javascript"> var china=new Object();china['北京市']=new Array('北京市区' ...

  7. 管理页面的类 PageHelper

    using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Da ...

  8. cordova学习:事件Events

    deviceready: 当cordova完全加载,可以调用cordova API接口 支持平台:Amazon.Fire OS.Android.BlackBerry 10.iOS.Tizen.Wind ...

  9. Selenium2+python自动化7-xpath定位【转载】

    前言 在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语法. ...

  10. NetStream论文

    https://max.book118.com/html/2016/0102/32573670.shtm http://www.docin.com/p-1568348795.html