react antd formマルチグループフォームデータ処理
12238 ワード
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 ;
break;
case 'char':
return ;
break;
case 'date':
return ;
break;
case 'select':
return (
);
default:
return ;
break;
}
}
render() {
const {getFieldDecorator} = this.props.form;
const dynamicForm = (
this.handleSubmit} className="form-layout">{
this.state.formNumber.map((formArray, formIndex) => {
return (
{
this.state.formNumber.length > 1 ?
this.removeForm(formArray)}>
このformフォームデータのセットを削除
: 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 (
{...formItemLayout}
label={item.text}
hasFeedback>
{getFieldDecorator(item.field + '_' + key, {
initialValue: item.value,
rules: [{
required: item.required,
message: item.errorMessage
}],
})(
this.switchItem(item)
)}
)
})
)
})
}
)
})
}
this.addForm}>
データのセットを追加
送信
);
return (
{dynamicForm}
);
};
}
const AntForm = Form.create()(AntFormTemplate);
export default AntForm
転載先:https://www.cnblogs.com/Nyan-Workflow-FC/p/8656408.html