关于 Antd Vue 动态表单的实现,可以先来看看 Ant Design 动态增减嵌套字段 的效果:
期望通过动态表单获得的数据结构如下:
[{
name:'111',
msg:'aaa'
},{
name:'222',
msg:'bbb'
}]
在这个过程中遇到了一些问题:
数据联动的问题
正常效果如下:
异常状态:
原本以为是每条数据都要有一个带有唯一值的字段,才能防止数据联动时出现同时联动的问题。 后来发现因为每次添加行数据,使用的都是旧的对象进行添加,导致数据一起联动。
只要执行如下代码即可解决:
const obj = {...this.rowObj}
this.form.push(obj)
父子组件问题
当动态表单作为父元素,内部的输入框等作为子元素封装成单独的组件时,想要获取整张表单的元素:
- 可以通过 $refs 来获取
- 或者通过监听各个子组件值的改变,触发数据的更新。但要注意的是如果直接为 form 标签添加 @change 事件,无法监听到除了输入框以外的值的变化,比如下拉选择框、日期选择框等等(曾经在这里踩了个坑)
最后发现官方文档中并未支持对整张表单绑定 @change 事件
校验问题
预期的效果如下,只会校验不符合校验规则的输入框:
可以通过对每个 a-form-item 设置不同的 name 来实现,如果写成相同的,会被同时进行校验
<a-form ref="formRef" :model="form" >
<a-form-item :name=`name_${index}` :rules="{ required: true, message: '这是一个必填项' }" >
// ...
</ a-form-item>
</a-form>