我对 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>
,而只是在顶层连接。今晚我将对此进行测试。