【发布时间】:2018-06-28 19:57:41
【问题描述】:
我在我的 react/redux 应用中遇到了一些性能问题。
我正在我的一个减速器中处理一个非常深的对象。它包含一个名为list 的对象,其中包含一个对象集合。
const state = {
list: {
one: {
id: 'one',
name: 'One',
active: false
},
two: {
id: 'two',
name: 'Two',
active: false
}
}
}
对象中的每个项目都用于渲染一个组件。该组件将访问项目的属性,如下所示:
const List = (props) => {
const listItems = Object.keys(props.list).map((key) => {
const item = props.list[key];
return (
<Item key={item.id} active={item.active}>
{item.name}
</Item>
);
});
return <ul>{listItems}</ul>;
};
但是,每次我运行以下代码时,我的组件(它是一个 PureComponent)都会呈现。
case UPDATE_LIST_ITEM:
return {
...state,
list: {
...state.list,
[payload.itemId]: {
...state.list[payload.itemId],
},
},
};
Redux 文档提到“必须适当地复制和更新每一层嵌套”,然而,我什至没有更新任何值,而只是复制了对象。
我不确定这里可以做什么。现在是实现像 Immutable.js 这样的库的好时机吗?
更新:
另外(我不太确定这是否有帮助),以下 redux 更新不会导致我的组件呈现:
case UPDATE_LIST_ITEM:
return {
...state,
list: {
...state.list,
[payload.itemId]: state.list[payload.itemId],
},
};
【问题讨论】:
-
似乎每次你的reducer返回一个新状态时,它都会触发消耗整个对象的每个组件的重新渲染。也许我不理解你。你的对象是不是比上面那一两个人复杂得多?
-
它还有一些属性,但仅此而已
-
我相信这个问题是由对象指针改变引起的,因此导致了渲染。我想知道我是否应该执行检查以确保我应该返回一个新的/更新的状态副本,以及像 Immutable.js 这样的东西是否可以帮助解决这个问题
-
您的
mapState函数是什么样的?您可能正在向PureComponent提交正在更新的状态部分,所以是的,它将重新呈现。 -
我不太清楚你的意思。我有一个部分,我在其中映射
Object.keys(props.list)以呈现列表项(显示在我的问题中)
标签: reactjs redux immutability immutable.js