【问题标题】:React - items in loop as an array data in state - rerendering itemsReact - 循环中的项目作为状态中的数组数据 - 重新渲染项目
【发布时间】:2016-03-18 18:39:07
【问题描述】:

在 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});

提前致谢。

【问题讨论】:

    标签: javascript arrays reactjs


    【解决方案1】:

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

    您需要提供一个更可预测的密钥,或者确保每个项目只生成一次随机密钥。

    【讨论】:

    • 我也有同样的问题^^,所以如果在循环渲染中不会有随机键,并且我们只更改数据中的一个元素,它只会重新渲染这个特定元素本身?还是我们应该添加一些额外的代码来实现这一点?谢谢!
    • 是的,关键在于防止不必要的重新渲染。请参阅此处的文档:reactjs.org/docs/lists-and-keys.html 如果您有任何其他问题,请开始新帖子。
    猜你喜欢
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多