React遍历多个Ant Design中的Upload组件时,随意删除任一个Upload出现了bug,依次点击上传图片后,当点击删除时,倒着删除没有问题,从中间和从开头删问题出现了,出现了类似塌方的效果,要删除的Upload元素下面的Upload的元素下面的内容没有了。解决方法:将map遍历中的key={index}改为key={item}

import { Upload, message, Button, Icon } from 'antd';

class UploadImageContainer extends Component{
consructor(props){
super(props);
this.state = {
arr:[0, 1, 3]
};
} removeItem=(delItem)=>{
this.setState(preState=>({
arr: preState.arr.filter(item=>item !== delItem)
}));
}; render(){
return(
<div>
{
this.state.arr.map((item, index)=>(
<div key={index}>
<Upload {...props}>
<Button>
<Icon type="upload" /> Click to Upload
</Button>
<button onClick={()=>removeItem(item)}>删除{item}</button>
</Upload>
</div>
))
}
</div>
)
}
} export default UploadImageContainer;

key是一个字符串,用来唯一标识同父同层级的兄弟元素。当React作diff时,只要子元素有key属性,便会去原v-dom树中相应位置(当前横向比较的层级)寻找是否有同key元素,比较它们是否完全相同,若是则复用该元素,免去不必要的操作。

当React的render里不设置key 或者key={index} 时,每次新挂载的节点都是0(其他节点能在willreceiveprops中接检测到改变),因为逆序之后,最后一个元素是0,而这个元素的key之前是没有的,所以要新增节点。要实现目标,需要通过在App的render中设置key={arr.length-index}(因为本例的数组简单,设key={item}也可以),告诉react对应的位置不需要重新挂载。

react.js map遍历的问题的更多相关文章

  1. js Map 遍历

    1. 在知道的key的情况下遍历map自然就跟数组一样的访. 2.在不知道key的情况下遍历map(此情况更多吧)    2.1  for(var key in Map){  };  //第一种   ...

  2. 应该用forEach改变数组的值吗? 原生JS forEach()和map()遍历的异同点

    应该用forEach改变数组的值吗? https://segmentfault.com/q/1010000013170900?utm_source=index-hottest 由于js中的数组是引用类 ...

  3. 原生JS forEach()和map()遍历的区别以及兼容写法

    一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...

  4. js jquery 遍历 for,while,each,map,grep

    js jquery 遍历 一,for循环. // 第一种var arr = [1, 2, 3];for(var i = 0; i < arr.length; i++) { console.log ...

  5. 原生JS forEach()和map()遍历,jQuery$.each()和$.map()遍历

    一.原生JS forEach()和map()遍历 共同点: 1.都是循环遍历数组中的每一项. 2.forEach() 和 map() 里面每一次执行匿名函数都支持3个参数:数组中的当前项item,当前 ...

  6. js中三个对数组操作的函数 indexOf()方法 filter筛选 forEach遍历 map遍历

     indexOf()方法  indexOf()方法返回在该数组中第一个找到的元素位置,如果它不存在则返回-1. 不使用indexOf时 var arr = ['apple','orange','pea ...

  7. js的map遍历和array遍历

    1. array遍历: [1].forEach() forEach是ES5中操作数组的一种方法,主要功能是遍历数组.forEach方法中的function回调有三个参数:第一个参数是遍历的数组内容,第 ...

  8. React.js入门笔记

    # React.js入门笔记 核心提示 这是本人学习react.js的第一篇入门笔记,估计也会是该系列涵盖内容最多的笔记,主要内容来自英文官方文档的快速上手部分和阮一峰博客教程.当然,还有我自己尝试的 ...

  9. React JS 基础知识17条

    1. 基础实例 <!DOCTYPE html> <html> <head> <script src="../build/react.js" ...

随机推荐

  1. 洛谷 P2440 木材加工【基础二分】

    题目链接:https://www.luogu.org/problemnew/show/P2440 题目描述 木材厂有一些原木,现在想把这些木头切割成一些长度相同的小段木头(木头有可能有 剩余),需要得 ...

  2. python的os模块总结

    python的os模块总结 目录 常用方法和属性总结 文件操作 目录操作 常用方法和属性总结 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir(&quo ...

  3. window下mongodb安装和配置

    mongodb安装和配置 1.下载:https://www.mongodb.com 2.解压到盘的根目录下,本人解压到D盘根目录 3.在软件根目录下新建一个文件夹data 4.再新建两个文件夹db.l ...

  4. 团队作业第六次——团队Github实战训练

    作业格式 课程名称:软件工程1916|W(福州大学) 作业要求:团队作业第六次-团队Github实战训练 团队名称:葫芦娃队 作业目标:确定和分析选题,绘制评审表 github地址:https://g ...

  5. tmux使用心得

    1,在终端输入tmux命令进入tmux, control+b x,关闭tmux的初始化session 2,创建自己的session,然后进行分屏

  6. bzoj 3450 期望分数

    自己只能想到O(n^2)的: dp[i][j] 表示 以i结尾,长度为j的o串的概率,然后在每次遇到x的时候算分数. 正解是: dp[i]表示前i个的答案,d[i]表示以i结尾的期望长度. 推的时候它 ...

  7. CocosCreator的Sprite的更换

    先上图,左侧是运行的效果, cc.Class({ extends: cc.Component, /* * cocos creator动态更换纹理 *方法一,预先在编辑器里设置好所有的纹理,绑定到对应的 ...

  8. nginx日志分析工具

    https://www.linuxidc.com/Linux/2016-12/138731.htm

  9. UDP中使用bind和connect的作用

    1:UDP中可以使用connect系统调用 2:UDP中connect操作与TCP中connect操作有着本质区别. TCP中调用connect会引起三次握手,client与server建立连结.UD ...

  10. 体验jQuery和AngularJS的不同点以及AngularJS的迷人之处

    本篇通过jQuery和Angular两种方式来实现同一个实例,从而体验两者的不同点以及AngularJS的迷人之处. 首先当然需要引用jquery.js和angular.js文件. ■ 使用jQuer ...