javascript - React - 循环中的项目作为状态中的数组数据 - 重新呈现项目

标签 javascript arrays reactjs

在 React 中,我在循环中重新渲染项目组件时遇到问题。我有一个主要组件,其状态如下:

this.state = {
    data: [{...}, {...}, {...}]
}

我迭代此数据:

render() {
        const elems = this.state.data.map(item => {
        let id = randomId();
        return (
            <ItemComponent
                key={id}
                id={id} (...other props) />
        )
    });
    return (
        <div>
            {elems}
        </div>
    );
}

该组件具有特殊的带有动画的 CSS 类,因此如果组件被渲染它是动画的(小动画)并且一切正常,但是当我向状态添加一些东西时(另一个“数据”数组对象项)所有项目都被重新渲染所以一切都开始活跃起来。我只想要新的动画。这是重新呈现所有项目的问题。当新的出现在 data 数组中时,不应呈现旧的。我确信这里缺少一些基本的东西。我知道有 shouldComponentUpdate 并且我尝试在我的 ItemComponent 中使用它,但它在那里什么也不做,即使我将它设置为 return false:/

我能用它做什么?我只是不想重新渲染不会改变并且只是渲染的项目。我只想将新对象添加到 data 数组触发状态更改并再次呈现添加的对象而不是所有项目。我认为 React 可以在内部管理它。或者也许有一种方法可以在我的 ItemComponent 中使用 shouldComponentUpdate

我通过以下方式添加新项目:

newArray = this.state.data.slice();
newArray.push({...});
this.setState({data: newArray});

提前致谢。

最佳答案

问题是您的 key 。在 React 中,key 唯一标识组件。但是您的 key 是在每次渲染时随机生成的。这就是为什么 React 在每次渲染时将每个项目都视为一个新组件。

您需要想出一个更可预测的 key ,或者确保每个项目只生成一次随 secret 钥。

关于javascript - React - 循环中的项目作为状态中的数组数据 - 重新呈现项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34247439/

相关文章:

javascript - AWS : Layer code not found when using "sam invoke local"

javascript - Chrome 通知

css - 如何使 ngClass 响应 Angular 中的数组成员资格?

reactjs - React 样式组件

reactjs - Material-UI 在打开对话框时向 body 标签添加填充

javaScript 不适用于由 jquery 加载函数加载的页面

javascript - Article.createdAt.toLocalDateString 不是函数

c++ - 将文件读入数组并从函数 C++ 返回它

java - 表达式的类型必须是数组类型但解析为 char

reactjs - 如果我在 tsconfig 中使用自定义路径,Webpack Dev Server 无法找到带有 Typescript 的模块