- 用react结合antd组件做了一个项目,在需要动态表单这一块时候,用了antd官网的from动态表单(下图)
(一开始是没有input出现的,点击一下Add field就会出现一个)
2.今天在测试项目的时候,(有添加,列表和编辑页面, 从列表页面点击数据可以进入编辑页面,并且传递你点击的那条数据的所有东西), 我在测试的时候就发现,动态表单上input的默认值一条数据还可以设置(initialValue),当数据多了的时候,就不行了。
点击Add field的时候,下面的input的默认值也是 张小胖 。
我现在想要实现的功能就是 默认显示两条不一样的数据在input上, 再点击Add field的出现的input是没有默认值的
有没有大佬帮忙解决一下!!!!!!!!!!!急,,,,十万火急
下面这个是官方的代码,我在项目中也是直接拿过来就用的 没有改动
import { Form, Input, Icon, Button } from 'antd';
const FormItem = Form.Item;
let uuid = 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(uuid);
uuid++;
// 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) {
console.log('Received values of form: ', values);
}
});
}
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) => {
return (
<FormItem
{...(index === 0 ? formItemLayout : formItemLayoutWithOutLabel)}
label={index === 0 ? 'Passengers' : ''}
required={false}
key={k}
>
{getFieldDecorator(`names[${k}]`, {
validateTrigger: ['onChange', 'onBlur'],
rules: [{
required: true,
whitespace: true,
message: "Please input passenger's name or delete this field.",
}],
})(
<Input placeholder="passenger name" style={{ width: '60%', marginRight: 8 }} />
)}
{keys.length > 1 ? (
<Icon
className="dynamic-delete-button"
type="minus-circle-o"
disabled={keys.length === 1}
onClick={() => this.remove(k)}
/>
) : null}
</FormItem>
);
});
return (
<Form onSubmit={this.handleSubmit}>
{formItems}
<FormItem {...formItemLayoutWithOutLabel}>
<Button type="dashed" onClick={this.add} style={{ width: '60%' }}>
<Icon type="plus" /> Add field
</Button>
</FormItem>
<FormItem {...formItemLayoutWithOutLabel}>
<Button type="primary" htmlType="submit">Submit</Button>
</FormItem>
</Form>
);
}
}
const WrappedDynamicFieldSet = Form.create()(DynamicFieldSet);
ReactDOM.render(<WrappedDynamicFieldSet />, mountNode);
第一,
FormItem
中需要搭配getFieldDecorator
一起使用。第二,所有的
FormItem
中getFieldDecorator
的name
不能重复,最好和表单feild
名称一样。第三,动态新增的
FormItem
,也要确保getFieldDecorator
的name
不能和以前的重复。第四,动态新增的
FormItem
的元素,最好指定惟一的key
.比如:<Input key={'only key'} />