import React from "react"; import styles from "./index.less"; import { Form, Input, Icon, Button } from "antd"; let id = 0; class DynamicFieldSet extends React.Component { remove = k => { const { form } = this.props; // can use data-binding to get const keys = form.getFieldValue("keys"); // We need at least one passenger if (keys.length === 1) { return; } // can use data-binding to set form.setFieldsValue({ keys: keys.filter(key => key !== k) }); }; add = () => { const { form } = this.props; // can use data-binding to get const keys = form.getFieldValue("keys"); const nextKeys = keys.concat(id++); // can use data-binding to set // important! notify form to detect changes form.setFieldsValue({ keys: nextKeys }); }; handleSubmit = e => { e.preventDefault(); this.props.form.validateFields((err, values) => { if (!err) { const { keys, names } = values; console.log("Received values of form: ", values); console.log("Merged values:", keys.map(key => names[key])); } }); }; render() { const { getFieldDecorator, getFieldValue } = this.props.form; const formItemLayout = { labelCol: { xs: { span: 24 }, sm: { span: 4 } }, wrapperCol: { xs: { span: 24 }, sm: { span: 20 } } }; const formItemLayoutWithOutLabel = { wrapperCol: { xs: { span: 24, offset: 0 }, sm: { span: 20, offset: 4 } } }; getFieldDecorator("keys", { initialValue: [] }); const keys = getFieldValue("keys"); const formItems = keys.map((k, index) => ( {getFieldDecorator(`names[${k}]`, { validateTrigger: ["onChange", "onBlur"], rules: [ { required: true, whitespace: true, message: "Please input passenger's name or delete this field." } ] })( )} {keys.length > 1 ? ( this.remove(k)} /> ) : null} )); return (
{formItems}
); } } const WrappedDynamicFieldSet = Form.create({ name: "dynamic_form_item" })( DynamicFieldSet ); export default () => (
);