Ant Design的Form组件中FormItem名称相同引起的问题
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名称相同引起的问题的更多相关文章
- Ant Design的Form
Ant Design的Form 使用onFieldsChange时不要与 mapPropsToFields一起使用,将导致表单校验等失效
- 2017.11.6 - ant design table等组件的使用,以及 chrome 中 network 的使用
一.今日主要任务 悉尼小程序后台管理开发: 景点管理页面: 获取已有数据列表,选取部分数据呈现在表格中,根据景点名称.分类过滤出对应的景点. 二.难点 1. 项目技术选取: ant design. ...
- 使用Ant Design的select组件时placeholder不生效/不起作用的解决办法
先来说说使用Ant Design和Element-ui的感觉吧. 公司的项目开发中用的是vue+element-ui,使用了一通下来后,觉得element-ui虽然也有一些问题或坑,但这些小问题或坑凭 ...
- react的ant design的UI组件库
PC官网:https://ant.design/ 移动端网址:https://mobile.ant.design/docs/react/introduce-cn antd-mobile :是 Ant ...
- Ant Design 日期选择组件RangePicker 选择时间范围后计算范围内的天数。
/** *需求:同年同月,同年不同月(两个月相减大于1,小于1),不同年(两个年相减大于1(是否为闰年),小于1),起止包含的月份及天 */ //首先引入组件 import { DatePicker} ...
- ant design 的Table组件固定表头时不对齐
现在有一个表格,里面的列数是不固定的(可以重复写入数据),且列数行数都可能很多,就带来一个问题: 必须要固定表头,但是antd 的表格组件设置了固定表格 scroll={{x:1000,y:300}} ...
- ant design环境搭建过程中遇到的问题--Windows-dva-cli
基础的此处略去,nodejs和npm是前提. 1.官网介绍的是脚手架工具是antd-init,但是又建议真实项目中用dva-cli,所以博主就直接装的是dva-cli,这里主要是简单介绍下博主在Win ...
- 如何在form组件中添加一个单选或者多选的字段
解决办法: 需要在增加的类里面加入choices 具体操作如下:
- Ant Design of Vue 组件库的使用
文档里面很清楚 安装步骤 这是全部引入的 1 有的组价涉及到汉化的问题 import moment from 'moment' import '../../../../node_modules ...
随机推荐
- svn利用钩子脚本功能实现代码同步到web目录
一.hook简单介绍 为了方便管理员控制提交的过程 ,Subversion提供了hook机制.当特定的 事件发生时,相应的 hook会被调用,hook其实就相当于特定事件的处理函数.每个hook会得到 ...
- GDOI模拟4.11~4.13总结
总体情况 省选前的第一场模拟,就连续三天垫底滚粗了. 三天下来,只做了第一天的签到题,然后再做了一些水题的暴力,还不得分. 三天分数:100/400+40/400+90/400=230/1200,得了 ...
- 2019-8-31-dotnet-core-用值初始化整个数组
title author date CreateTime categories dotnet core 用值初始化整个数组 lindexi 2019-08-31 16:55:58 +0800 2019 ...
- python Match函数
- Python 运算符括号
- 【JZOJ4786】【NOIP2016提高A组模拟9.17】小a的强迫症
题目描述 输入 输出 样例输入 3 2 2 1 样例输出 3 数据范围 样例解释 解法 先假定每种颜色的珠子取一个按顺序排列. 设这n个珠子就是每一种颜色的珠子的最后一个. 考虑逐个把珠子放入. 对于 ...
- jQuery事件大全(真的很全)
DOM Attribute $("p").addClass(css中定义的样式类型); 给某个元素添加样式$("img").attr({src:"te ...
- jquery find 推荐
https://codeplayer.vip/p/j7soa 这篇写的还是不错的,备用. // 返回jQuery对象所有匹配元素的标识信息数组 // 每个元素形如:tagName或tagName#id ...
- Docker for windows pull镜像文件的安装位置改变方法
发生现象: 在windows10下安装docker for windows,随着用docker pull image文件后,C盘的容量越来越小了,你可能也有一种跟我一样的想法,想改变默认的安装路径,本 ...
- node写简单的爬虫(二)
上次我们已经成功的爬取了网站上的图片,现在我们把爬取的图片存储到本地 首先引入request var request=require('request'); http.get(url, functio ...