react.js map遍历的问题

Posted axl234

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react.js map遍历的问题相关的知识,希望对你有一定的参考价值。

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遍历的问题的主要内容,如果未能解决你的问题,请参考以下文章

如何在react.js 中利用for循环之类的输出html

React Js循环遍历父数组以进行登录授权

如何使用 react-google-maps 在 React.JS 中获取多边形的坐标

如何在 React Js 中使用 map 实现嵌套循环

react js map功能无法渲染自定义组件

React js react-google-maps-api 更改颜色标记默认