前言:以下内容基于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. c语言数组传递

    转自:http://blog.csdn.net/xgmiao/article/details/9570825 点击打开链接 数组作为函数实参: C语言中数组作为函数实参时,编译器总是将其解析为指向数组 ...

  2. [USACO06NOV]玉米田Corn Fields (状压$dp$)

    题目链接 Solution 状压 \(dp\) . \(f[i][j][k]\) 代表前 \(i\) 列中 , 已经安置 \(j\) 块草皮,且最后一位状态为 \(k\) . 同时多记录一个每一列中的 ...

  3. confluence6.3安装、破解

    confluence是一个专业的企业知识管理与协同软件,可以用于构建企业wiki.通过它可以实现团队成员之间的协作和知识共享.现在大多数公司都会部署一套confluence,用作内部wiki.现在co ...

  4. Registering RHEL6 Clients into spacewalk

    Before Starting(login to spacwalk server) 1.Create a base channel within Spacewalk (Channels > Ma ...

  5. cpj-swagger分别整合struts2、spring mvc、servlet

    cpj-swagger 原文地址:https://github.com/3cpj/swagger 1. Swagger是什么? 官方说法:Swagger是一个规范和完整的框架,用于生成.描述.调用和可 ...

  6. SJCL:斯坦福大学JS加密库

    斯坦福大学Javascript加密库简称SJCL,是一个由斯坦福大学计算机安全实验室创立的项目,旨在创建一个安全.快速.短小精悍.易使用.跨浏览器的JavaScript加密库.(斯坦福大学下载地址:h ...

  7. OPEN SUSE LINUX

    1. 把中文界面变成英文界面 yast2->system->language: 主要语言: 美式英语US 2. 使用root用户默认登录 Ubuntu使用root登录        Ubu ...

  8. opengl glEnableClientState() 和 glDisableClientState() 作用

    http://zhidao.baidu.com/link?url=c3m55lgpjhU1Rb7TEP-aTGQAX3-GrcBk5NaUC2UA1ZtQiCCtHJzB_KoG7pWvPEybfYv ...

  9. django获取请求参数

    1.获取URL路径中的参数 需求:假设用户访问127.0.0.1/user/1/2,你想获取1,2.应该怎么操作呢? (1)未命名参数(位置参数) # 在项目下的urls.py下增加设置: url(r ...

  10. Request的Body只能读取一次解决方法

    一.需要一个类继承HttpServletRequestWrapper,该类继承了ServletRequestWrapper并实现了HttpServletRequest, 因此它可作为request在F ...