【发布时间】:2016-05-01 03:10:20
【问题描述】:
我对 React、Redux 和 ImmutableJS 还很陌生,并且遇到了一些性能问题。
我有一个大型数据树结构,我目前将其作为平面列表存储在此结构中:
new Map({
1: new Node({
id: 1,
text: 'Root',
children: [2,3]
}),
2: new Node({
id: 2,
text: 'Child 1',
children: [4]
}),
3: new Node({
id: 3,
text: 'Child 2',
children: []
}),
4: new Node({
id: 4,
text: 'Child of child 1',
children: []
})
});
虽然将其构建为平面列表可以轻松更新节点,但我发现随着树的增长,交互变得迟缓。交互包括能够选择一个或多个节点、切换其子节点的可见性、更新文本等。看起来 UI 缓慢的一个关键原因是每次交互都会重新绘制整个树。
我想使用shouldComponentUpdate,这样如果我更新节点 3,节点 2 和 4 就不会更新。如果将数据存储为树,这将很容易(我可以简单地检查是否为this.props !== nextProps),但由于数据存储在平面列表中,因此检查会更加复杂。
我应该如何存储数据并使用shouldComponentUpdate(或其他方法)来支持具有数百或数千个树节点的流畅 UI?
编辑
我一直在连接顶层的商店,然后不得不将整个商店向下传递给子组件。
我的结构是:
<NodeTree>
<NodeBranch>
<Node>{{text}}</Node>
<NodeTree>...</NodeTree>
</NodeBranch>
<NodeBranch>
<Node>{{text}}</Node>
<NodeTree>...</NodeTree>
</NodeBranch>
...
</NodeTree>
<Node> 可以使用 shouldComponentUpdate 进行简单检查,以查看标题是否已更改,但鉴于树的递归性质,我没有类似的解决方案可用于 <NodeTree> 或 <NodeBranch>。
看起来最好的解决方案(感谢@Dan Abramov)是连接每个<NodeBranch>,而不是仅在顶层连接。今天晚上我将进行测试。
【问题讨论】:
-
shouldComponentUpdate与您的 React 组件是否应该重新渲染有关,而不是与更新/编辑存储中的数据的逻辑有关。向我们展示您用于更新商店的代码。 -
如何将数据从存储传递到树组件?你的树组件是如何构成的——它是一个单一的组件,是嵌套的组件,嵌套的连接组件......?
标签: reactjs redux immutable.js