【发布时间】:2017-12-15 13:12:35
【问题描述】:
所以我正在使用 React 编写一个应用程序,发生的事情是我有一个组件,其状态中有一个相当大的列表。我正在从网络获取 JSON 文件,然后将过滤后的副本直接存储到组件的状态。可能不是最佳解决方案,但我认为这仍然可以,React 应该可以处理它,我的意思是,它只有 10 kB。
无论如何,我决定将搜索输入添加到我的组件并将其值存储到其状态。现在我有大列表和 searchInput 的状态,我设置状态每个 onChange 并根据它过滤列表。
而且速度非常慢。每个 setState 都在刷新列表并对组件的每个子项和子项执行 componentUpdates,这基本上使搜索无法使用。
所以我的问题是如何解决这个问题?我应该将过滤后的列表存储在 redux 存储中而不是本地组件状态中吗?这似乎也不是一个好的解决方案,因为我现在有一个全局 searchInput 值,我必须在休假时重置和删除它,我认为它作为本地值更好。
这是目前的情况:
list -> component -> filter list -> child -> split the list into 4 -> subchild -> map the sublist -> render the list item values
我也想添加额外的列表,其中包含显示哪些项目应该隐藏/显示的值,因此我不是操纵大列表,而是操纵较小的项目 ID 列表。但这似乎有点傻,这件事不应该这么难我的意思是人们已经用 JS 和 HTML 做列表已经有一段时间了。我正在考虑用 Vue 重新创建相同的组件,只是为了看看它会更好(我认为会)。
【问题讨论】:
-
您可以对网络响应的结果进行分页
-
@Héctor 你是什么意思?
-
您可以获取前 100 个项目(例如),而不是同时处理 5000 个项目,并在您的 web 应用程序中包含某种分页。因此,在您的状态下,同时只有 100 个项目,您的过滤会更快
-
最大的性能损失可能出现在您呈现列表项值时。您应该考虑仅在向下滚动时通过某种无限滚动来渲染实际可见的元素。我认为有一个名为
react-list的包可以做到这一点。 -
@JoeClay 是的,原始数据在 Redux reducer 中。这个列表实际上并没有那么长,只有 160 个带有一些嵌套属性,这就是为什么这件事在我看来如此愚蠢的原因。我只是想继续做更重要的事情。如果它有帮助,而且几天之内没人能提出明确的解决方案,我将制作一个代码 sn-p 或只是链接到 repo,以便任何人都可以自己查看。
标签: javascript performance reactjs setstate