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. Katalon系列二十:读写Excle

    import org.apache.poi.xssf.usermodel.XSSFSheet import org.apache.poi.xssf.usermodel.XSSFWorkbook Fil ...

  2. Mongodb停止和启动

    mongodb开启.停止.重启操作 #开启service mongodb start#停止service mongodb stop#重启service mongodb restart

  3. js单选按钮的默认值

    function SelectWindow(str) { initradio('PhysiotherapyOptionsTable.Sex',sex);       } function initra ...

  4. js不停地触发按钮的事件

    例子:不断地发匿名邮件 http://tool.chacuo.net/mailsend 在控制台写:setInterval('$(".convert :input[arg]").t ...

  5. Request.Cookies和Response.Cookies

    Request.Cookies创建的Cookie只能用于后台不能用于HTML的前台Response.Cookies操作过的Cookie,所有方法获取到的都是被更新过的值,也就是说Response.Co ...

  6. 开发一个登录接口(Mysql)

    分享一段代码,开发了一个登录接口: 使用Python开发,需要安装flask模块,使用pip intall flask 安装即可,这里使用的数据库是Mysql,所以导入了pymysql模块,代码如下: ...

  7. hdu1503 LCS

    题意:如果有相同的字母,这些字母只输出一次.其余的都输出. 先做一次LCS,标记相同的字母,然后回溯输出. #include<stdio.h> #include<string.h&g ...

  8. 你在用 JWT 代替 Session?

    现在,JSON Web Tokens (JWT) 是非常流行的.尤其是 Web 开发领域. 流行 安全 稳定 易用 支持 JSON 所有这些因素,令 JWT 名声大振. 但是,今天我要来说说使用 JW ...

  9. HZOJ Dash Speed

    测试点1-2:暴力. 测试点3-4:可以将边按r从大到小排序不断加入,然后用并茶几维护深度.好像也可以用猫树做. 好吧其他的部分分并没有看懂. 正解: 线段树分治,求出每个速度的答案. 对于速度区间$ ...

  10. 域名拆分 tld

    概念 URL Universal Resource Locator ,统一资源定位符. 用处:用来标识互联网资源的唯一地址. 本质:提供了互联网上任一资源地址的通用表示方法. protocol://h ...