1、问题描述

在使用Antd组件Form表单的过程中,会出现FormItem同名的情况,此时要特别注意同名引起的表单行为异常问题,主要表现在以下方面:

(1)同名表单项的值共享,并且其中一个的值改变,另外的同名表单的值也一致改变。

(2)同名表单中,表单控件比如<Input />的onChange等事件会出现行为异常的情况。

源码如下图所示:

import React, { PureComponent } from 'react';
import { Form, Input } from 'antd';
import styles from './styles.less'; @Form.create()
class Example extends PureComponent {
render() {
return (
<div className={styles.example}>
{
data.map((item, index) => (
<Form key={index}>
<h2>表单{index + 1}</h2>
<div>
<Form.Item label="名称">
{this.props.form.getFieldDecorator('name')(
<Input />
)}
</Form.Item>
</div>
<div>
<Form.Item label="数值">
{this.props.form.getFieldDecorator('value')(
<Input onChange={() => { console.log('index:', index); }} />
)}
</Form.Item>
</div>
</Form>
))
}
</div>
);
}
} const data = [{
name: '名称1',
value: 1,
}, {
name: '名称2',
value: 2,
}]; export default Example;

渲染界面如下图:

此时如果通过在表单1和表单2中输入数值触发两者的onChange事件,会发现控制台输出都是  index:1;

连表单项的<h2>表单{index + 1}</h2>内容都能正常渲染表单1、表单2,为什么onChange始终输出1呢?正常应该输出 index:0 和 index:1 。

2、问题分析:

同名的表单被当成完全相同的表单项处理,数值和onChange行为都一样,所以两个表单项的onChange始终只执行了最后一个表单项的onChange事件,index始终输出1.

要想得到正确的结果,应该分别分别修改两个表单中的域名,可以在现有字段名的基础上加上index,即改为如下内容:

             <div>
<Form.Item label="名称">
{this.props.form.getFieldDecorator('name' + index)(
<Input />
)}
</Form.Item>
</div>
<div>
<Form.Item label="数值">
{this.props.form.getFieldDecorator('value' + index)(
<Input onChange={() => { console.log('index:', index); }} />
)}
</Form.Item>
</div>

此时渲染的表单1和表单2的数值项的字段名分别是vlaue0和value1,就不会相互影响,经测试能正常输出index:0和index:1.  表单行为不再混淆。

3、拓展反思:

以上讨论的FormItem名称相同问题看似是个小问题,实际上很多情况如果不注意FormItem的名称唯一性,会造成很多问题,比如同名Item的值相互影响,以及以上所说的onChange行为异常(容易出错)。如果出现map渲染出多个表单时,可以利用名称+索引值使表单项名称唯一。

如有问题欢迎留言讨论。

原创博客禁止抄袭,转载请注明出处:原文地址:https://www.cnblogs.com/xiao-pengyou/

Ant Design的Form组件中FormItem名称相同引起的问题的更多相关文章

  1. Ant Design的Form

    Ant Design的Form 使用onFieldsChange时不要与 mapPropsToFields一起使用,将导致表单校验等失效

  2. 2017.11.6 - ant design table等组件的使用,以及 chrome 中 network 的使用

    一.今日主要任务 悉尼小程序后台管理开发: 景点管理页面: 获取已有数据列表,选取部分数据呈现在表格中,根据景点名称.分类过滤出对应的景点.   二.难点 1. 项目技术选取: ant design. ...

  3. 使用Ant Design的select组件时placeholder不生效/不起作用的解决办法

    先来说说使用Ant Design和Element-ui的感觉吧. 公司的项目开发中用的是vue+element-ui,使用了一通下来后,觉得element-ui虽然也有一些问题或坑,但这些小问题或坑凭 ...

  4. react的ant design的UI组件库

    PC官网:https://ant.design/ 移动端网址:https://mobile.ant.design/docs/react/introduce-cn antd-mobile :是 Ant ...

  5. Ant Design 日期选择组件RangePicker 选择时间范围后计算范围内的天数。

    /** *需求:同年同月,同年不同月(两个月相减大于1,小于1),不同年(两个年相减大于1(是否为闰年),小于1),起止包含的月份及天 */ //首先引入组件 import { DatePicker} ...

  6. ant design 的Table组件固定表头时不对齐

    现在有一个表格,里面的列数是不固定的(可以重复写入数据),且列数行数都可能很多,就带来一个问题: 必须要固定表头,但是antd 的表格组件设置了固定表格 scroll={{x:1000,y:300}} ...

  7. ant design环境搭建过程中遇到的问题--Windows-dva-cli

    基础的此处略去,nodejs和npm是前提. 1.官网介绍的是脚手架工具是antd-init,但是又建议真实项目中用dva-cli,所以博主就直接装的是dva-cli,这里主要是简单介绍下博主在Win ...

  8. 如何在form组件中添加一个单选或者多选的字段

    解决办法: 需要在增加的类里面加入choices   具体操作如下:

  9. Ant Design of Vue 组件库的使用

    文档里面很清楚 安装步骤    这是全部引入的 1  有的组价涉及到汉化的问题 import moment from 'moment' import '../../../../node_modules ...

随机推荐

  1. 为Array对象添加一个去除重复项的方法

    输入例子 [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN].uniq() 输出例子 [false, true, unde ...

  2. python正则表达式应用 去掉标点符号

  3. 【水滴石穿】rnTest

    其实就是一个小的demo,不过代码分的挺精巧的 先放地址:https://github.com/linchengzzz/rnTest 来看看效果 确实没有什么可以说的,不过代码部分还行 先入口文件 / ...

  4. php表单传值--GET和POST

    一.       传值 1.    传值/接收方法: 1)        GET(5种方式!) a)       表单Form: method = ‘get’   GET接收数据方式: b)      ...

  5. laravel 分页带参数

    {{$data->appends(request()->except(['page']))->links()}}

  6. golang进制

  7. Ubuntu 18.04中的Vim编辑器的高级配置

    VIM (Unix及类Unix系统文本编辑器) Vim是一个类似于Vi的著名的功能强大.高度可定制的文本编辑器,在Vi的基础上改进和增加了很多特性.VIM是开源软件. Vim普遍被推崇为类Vi编辑器中 ...

  8. android performance

    https://developer.android.com/studio/profile/systrace.html http://www.milan100.com/article/show/1544 ...

  9. md5小工具

    <?php$str = "123456";echo md5($str);?>

  10. 2019.9.19登陆注册猜数字给奖品combo

    #注册函数 def register(): registor_count = 0 while registor_count < 3: username_inp = input('user nam ...