import React from 'react';
import {Form, InputNumber, Input, DatePicker, Button, Select, Icon} from 'antd';
import moment from 'moment';
// 推荐在入口文件全局设置 locale
import 'moment/locale/zh-cn';
moment.locale('zh-cn'); import PageTitle from "component/page-title/PageTitle";
import AppBreadcrumb from "component/breadcrumb/AppBreadcrumb";
import './index.scss'; const FormItem = Form.Item;
const Option = Select.Option; // 后台返回的数据格式
const formData = [
{
'field': 'jobid',
'text': '工号',
'errorMessage': '请输入工号',
'required': true,
'type': 'int',
'value': 100
}, {
'field': 'date',
'text': '日期',
'errorMessage': '请输入日期',
'required': false,
'type': 'date',
'value': '2017-10-20'
}, {
'field': 'username',
'text': '用户名',
'errorMessage': '请输入用户名',
'required': true,
'type': 'char',
'value': 'hello world'
}, {
'field': 'customer',
'text': '客户',
'errorMessage': '请输入客户',
'required': true,
'type': 'select',
'value': '中兴',
'options': ['贝尔', '中兴', '烽火']
}
]; // formItem css 样式
const formItemLayout = {
labelCol: {
xs: {span: 24},
sm: {span: 6},
},
wrapperCol: {
xs: {span: 24},
sm: {span: 14},
}
}; // 保存按钮 css 样式
const tailFormItemLayout = {
wrapperCol: {
xs: {
span: 24,
offset: 0,
},
sm: {
span: 14,
offset: 6,
},
}
}; // form css 样式
const formLayout = {
width: 400,
marginTop: 100,
marginLeft: 'auto',
marginRight: 'auto'
};
let uuid = 0; class AntFormTemplate extends React.Component {
constructor(props) {
super(props);
this.state = {
showForm: true,
formNumber: []
};
this.addForm = this.addForm.bind(this);
this.removeForm = this.removeForm.bind(this);
this.handleSubmit = this.handleSubmit.bind(this);
} addForm() {
const formDataObj = {};
formDataObj['uuid' + uuid] = formData;
this.state.formNumber.push(formDataObj);
uuid++;
this.setState({
formNumber: this.state.formNumber
});
} removeForm(formArray) {
if (this.state.formNumber.length === 1) {
return;
}
this.setState({
formNumber: this.state.formNumber.filter(item => item !== formArray)
});
} handleSubmit(e) {
e.preventDefault();
let suffixes =[];
const formDataList = [];
this.props.form.validateFields((err, values) => {
if (!err) {
for (const key in values) {
if (values.hasOwnProperty(key)) {
values[key] = moment.isMoment(values[key]) ? values[key].format('YYYY-MM-DD') : values[key]
suffixes.push(key.split('_')[1]);
suffixes = Array.from(new Set(suffixes));
}
}
console.log('values:' + this.formDataFilter(formDataList, suffixes, values));
}
});
} formDataFilter(formDataList, suffixes, values) {
suffixes.forEach(function (item) {
const formdataObj = {};
for (const key in values) {
if (values.hasOwnProperty(key) && key.indexOf(item)!==-1) {
formdataObj[key.split('_')[0]] = values[key];
}
}
formDataList.push(formdataObj);
})
return formDataList;
}
/**
* 根据后台返回的 data 中 type 类型生成不同的组件
* @param item json
* @param Component
*/
switchItem(item) {
const type = item.type;
switch (type) {
case 'int':
return <InputNumber style={{width: '100%'}}/>;
break;
case 'char':
return <Input />;
break;
case 'date':
return <DatePicker style={{width: '100%'}}/>;
break;
case 'select':
return (
<Select>
{
item.options.map((option, index) => {
return (<Option key={index} value={option}>{option}</Option>)
})
}
</Select>
);
default:
return <Input />;
break;
}
} render() {
const {getFieldDecorator} = this.props.form;
const dynamicForm = (
<Form onSubmit={this.handleSubmit} className="form-layout">
{
this.state.formNumber.map((formArray, formIndex) => {
return (
<div key={'div_' + formIndex} className="form-number">
{
this.state.formNumber.length > 1 ?
<Button type="dashed" key={'btn_' + formIndex} onClick={() => this.removeForm(formArray)}>
<Icon key={'icon_' + formIndex} type="close">删除此组form表单数据</Icon>
</Button> : null
}
{
Object.keys(formArray).map(key => {
return (
formArray[key].map((item, index) => {
item.value = item.type === 'date' ? moment(item.value, 'YYYY-MM-DD') : item.value;
return (
<FormItem
key={formIndex + index}
{...formItemLayout}
label={item.text}
hasFeedback>
{getFieldDecorator(item.field + '_' + key, {
initialValue: item.value,
rules: [{
required: item.required,
message: item.errorMessage
}],
})(
this.switchItem(item)
)}
</FormItem>
)
})
)
})
}
</div>
)
})
}
<div className="form-number">
<Button type="dashed" onClick={this.addForm}>
<Icon type="plus"/>添加一组数据
</Button>
</div>
<div className="form-number">
<Button type="primary" htmlType="submit">提交</Button>
</div>
</Form>
);
return (
<div className="page-wrapper">
<AppBreadcrumb menu="主导航" submenu="多组表单form处理"/>
<PageTitle pageTitle="多组动态表单数据传输处理"/>
{dynamicForm}
</div>
);
};
}
const AntForm = Form.create()(AntFormTemplate);
export default AntForm

react antd form多组表单数据处理的更多相关文章

  1. antd form 自定义验证表单使用方法

    import React from 'react'; import classNames from 'classnames'; export default class FormClass exten ...

  2. jquery.form.js 让表单提交更优雅

    jquery.form.js 让表单提交更优雅.可以页面不刷新提交表单,比jQuery的ajax提交要功能强大. 1.引入 <script src="/src/jquery-1.9.1 ...

  3. <form> 标签 // HTML 表单 // from 表单转换成json 格式

    <form> 标签   // HTML 表单    // from 表单转换成json 格式 form 表单,对开发人员来说是在熟悉不过的了,它是页面与web服务器交互时的重要信息来源 表 ...

  4. [转] Form 表单数据处理 简单教程 formidable 使用心得

    入门,高手见笑 表单数据一种是get方式, 另一种是post 方式 1.get方式 对于get方式,node处理起来非常简单 如以下代码: var urlParsed = url.parse(requ ...

  5. javaWeb 中前端Form表单数据处理(手动拼json)

    在前端我们会用到最多的就是form表单提交数据,在form表单中有很多都是自动将数据传到后台,然后通过实体来接受的,但是有的时候我们就是需要在前端就拿到这个Form表单的数据,这是我们就可以自己讲数据 ...

  6. 基于React和Node.JS的表单录入系统的设计与实现

    一.写在前面 这是一个真实的项目,项目已经过去好久了,虽然很简单,但还是有很多思考点,跟随着笔者的脚步,一起来看看吧.本文纯属虚构,涉及到的相关信息均已做虚构处理, 二.背景 人活着一定要有信仰,没有 ...

  7. Ext.Form 自动填写表单内容

    前台: 表单必须含有name属性 if (action == 'edit' || action == 'show') { MyForm1.getForm().load({ url: '/data/cu ...

  8. 使用jquery.form.js提交表单上传文件

    方法: 1.formSerilize()  用于序列化表单中的数据,并将其自动整理成适合AJAX异步请求的URL地址格式. 2.clearForm()   清除表单中所有输入值的内容. 3.restF ...

  9. form + iframe 获取表单提交后返回的数据

    原理: submit 提交表单没有回调函数,但是可以用iframe来接收返回结果,最后进行格式转换就ok了: 原文地址: http://blog.csdn.net/simeng_1016/articl ...

随机推荐

  1. java多线程总结(二)

    线程一般有6个状态: 新建状态:NEW 可运行状态:RUNNABLE 休眠状态:TIMED_WAITING 等待状态:WAITING 阻塞状态:BLOCKED 终止状态“TERMINATED 当我们使 ...

  2. Delphi 正则表达式之TPerlRegEx 类的属性与方法(6): EscapeRegExChars 函数

    Delphi 正则表达式之TPerlRegEx 类的属性与方法(6): EscapeRegExChars 函数 // EscapeRegExChars 函数可以自动为特殊字符加转义符号 \ var   ...

  3. How to make TWebBrowser get focus in Delphi

    How to make TWebBrowser get focus in Delphi   Written by Administrator       Tags: Delphi Twebbrowse ...

  4. (转)Nginx反向代理设置 从80端口转向其他端口

    from :http://www.cnblogs.com/wuyou/p/3455381.html Nginx反向代理设置 从80端口转向其他端口   反向代理(Reverse Proxy)方式是指以 ...

  5. 什么是jstack

    以下是百度百科的内容 jstack是java虚拟机自带的一种堆栈跟踪工具. jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成 ...

  6. System.Linq.Dynamic 动态查询

    安装 VS->工具栏->NuGet程序管理器,System.Linq.Dynamic 注意: 使用动态查询必须先调用AsQueryable()方法,因为动态扩展仅适用于实现IQueryab ...

  7. 通过自动回复机器人学Mybatis:原始版本(包括JDBC、pom.xml等)

    imooc视频学习笔记 ----> URL:http://www.imooc.com/learn/154 list.jsp <%@ page contentType="text/ ...

  8. 混合开发的大趋势之 一个Android程序员眼中的 React.js 箭头函数,const, PropTypes

    转载请注明出处:王亟亟的大牛之路 昨天写了篇React.js的开头之作,讲了讲块级作用域和let,先安利:https://github.com/ddwhan0123/Useful-Open-Sourc ...

  9. 主机不能访问虚拟机web服务的问题

    虚拟机是CentOs 7 iptables -Fiptables -P INPUT ACCEPT 参考:http://blog.csdn.net/abnereel/article/details/41 ...

  10. eclipse向上/下复制一行(或者多行)的快捷键失效的基本解决方法

    在eclipse中,快捷键Ctrl+Alt+↓是向下复制选中的行,快捷键Ctrl+Alt+↑是向上复制选中的行. 这两个快捷键也是我常用的快捷键之一,以前也遇到失效. 所以现在记录一个解决的方法: 在 ...