【发布时间】:2018-10-30 00:35:49
【问题描述】:
我有一个 react 组件,每秒从 redux 存储接收道具。新状态有一个与上一个数组不同的数组。具体来说,每秒钟就有一个元素被添加到数组中。例如: 在一种状态下,数组是:
[1, 2, 3, 4, 5, 6]
下一个状态
[1, 2, 3, 4, 5, 6, 7]
我的减速机:
return {
...state,
myList: [ payload, ...state.myList.filter(item => payload.id !== item.id).slice(0, -1) ]
}
现在,在我的 react 组件中,我订阅了这个状态,并且对于每次更改,列表都会重新渲染。
import React, { Component } from 'react';
import MyRow from './MyRow';
class MyList extends Component {
render() {
return (
<div>
{this.props.myList.map((list, index) => (
<MyRow key={list.id} data={list}/>
))}
</div>
);
}
}
function select({ myList }) {
return { myList };
}
export default connect(select)(MyList);
在 MyRow.js 中
import { PureComponent } from 'react';
class MyRow extends PureComponent {
render() {
const data = this.props.data;
return (
<div>
{data.id} - {data.name}
</div>
);
}
}
export default MyRow;
现在,我的问题是:重新渲染每个已经渲染的元素对我来说成本很高。 MyRow 大量使用样式化组件和其他昂贵的操作。 这导致响应在状态更新时每秒重新渲染整个列表。如果更新时间少于 1 秒,例如每秒 4 次更新,情况会变得更糟。在这种情况下,react 应用程序只会崩溃。
有没有办法只将新添加的项目添加到列表中而不重新渲染整个列表?
谢谢
【问题讨论】:
-
关于性能优化的非常好的文章你可以找到here。
-
看起来您正确使用了键,这可以让反应了解哪些元素是新的,因此 vDOM 不应重新渲染所有项目,而是根据需要更新 reactjs.org/docs/lists-and-keys.html。
-
@Reza 你可以看看我的详细回答,如果有不清楚的地方,请告诉我。
标签: javascript reactjs redux react-redux