Form表单数组字段增删问题
- 场景还原
在我们做表单这块的时候可能会遇到以下原型:
表单中其中一个字段是个数组,数组的每一项是个对象,可能有多个字段,且支持删除和新增。
那么问题来了,这种情况,我们如何设计数据结构、如何设计我们的Form表单?
- 实现动态增删效果
<FormItem
{...formItemLayout}
// required
label="字段匹配"
>
{(dataId ? (currentData && currentData.columns ? currentData.columns : []) : columns).map((rule, index) => {
let ruleKeys = `columns[${index}]`;
return (
<div style={{ marginBottom: 15 }} key={`columns-${index}`}>
<FormItem
style={{
display: 'inline-block',
width: 100,
marginBottom: 0,
marginRight: 10
}}
>
{
getFieldDecorator(`${ruleKeys}.condition`, {
initialValue: rule ? rule.condition : 0,
rules: [{ required: !form.getFieldValue(`${ruleKeys}.column`) ? false : true, message: '请选择条件!' }],
})(
<Select disabled={isView} placeholder="请选择条件" style={{ width: 100, marginRight: 10, display: "inline-block" }} >
<Option key={-1} value="">请选择</Option>
<Option key={0} value={"0"}>包含</Option>
<Option key={1} value={"1"}>不包含</Option>
</Select>
)}
</FormItem>
<FormItem
style={{
display: 'inline-block',
width: 150,
}}
>
{getFieldDecorator(`${ruleKeys}.column`, {
initialValue: rule ? rule.column : '',
rules: [
{
required: !form.getFieldValue(`${ruleKeys}.condition`) ? false : true,
message: '请输入字段名!'
}
// {validator: this.vaildColumn}
]
})(
<Input placeholder="请输入字段" style={{ width: 140, marginRight: 10, display: "inline-block" }} disabled={isView} />
)}
</FormItem>
{index == 0 ?
<div style={{ display: 'inline-block', marginTop: '5px' }} className="f-fr">
<Icon className="f-fr"
onClick={this.addRules}
style={{ marginLeft: '5px', marginTop: '7px', fontSize: '16px' }}
type="plus-circle-o" />
<Tooltip title="字段">
<Icon className="f-fr"
// onClick={this.addRules}
style={{ marginTop: '7px', fontSize: '16px' }}
type="question-circle-o" />
</Tooltip>
</div> :
<Icon className="f-fr"
onClick={this.deleteRules.bind(this, index)}
style={{ marginTop: '7px', fontSize: '16px', marginTop: '11px' }}
type="minus-circle-o" />
}
</div>
)
})}
</FormItem>
用一个数组去存当前这个字段,此数组叫“columns”,数组的每一项里的字段名为“columns[k][字段名]”,例如“columns[k].condition”,最后Form会将数据全都按照格式存入对应字段,结构如下:
新增按钮就对应插入一个字段节点为空的对象:
删除同样找到对应的index,删除该index对应的那一项:
但是,
请注意,我发现之前很多代码会有这个问题,只是从数据层面上删除了,但是从界面上看到的是删除了最后一个,并没有删除对应项,造成这个问题的原因是,我们没有将界面也进行对应的整理。
点击“word2”后面的删除后,变成下图:
这样展示上肯定是有问题的,解决办法是,将Form表单对应的值也对应刷新、复写,删除时做以下操作:
好啦~今日分享就到这里了,有更优解决方案敬请提出~