【问题标题】:React setState slow反应 setState 慢
【发布时间】: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


【解决方案1】:

我看到了你的问题。实际上,慢的不是 setState,而是渲染和您在所述状态下搜索事物的方式。

如果我是你,我会在两件事上投入时间:

  1. 去抖进行搜索

debounce 不会立即触发搜索,而是“等待”一段时间让用户停止输入,然后触发该功能。

这是 React 中的一个示例:

// you can use another one. I've just used this one before and it works
import debounce from "throttle-debounce";

class SearchBox extends React.Component {
    constructor(props) {
        super(props);
        // "waits" for 750 ms
        this.search = debounce(this.search, 750);
    }

    search() { ... }

    render() {
      <input type="text" onKeyUp={this.search} />
    }
}
  1. 如果您的列表很大,那么memoization 是一个不错的选择。你可以使用react-virtualized

用于高效渲染大型列表和表格的 React 组件 数据

您甚至可以访问 List 演示 here

  1. 良好的 UI 设计和分页

react-virtualized List 组件只会呈现用户正在看到的内容。所以如果你有一个不错的 UI 设计,你可以从一个非常大的值列表中获得很多性能。

很多时候,这取决于您如何向最终用户显示数据。因此,您可以为数据添加分页,并通过分页链接或无限滚动功能获取更多信息。

希望我能帮上忙

【讨论】:

  • 感谢您的帮助和时间。我遇到的问题是组件状态的常量 setStating,它的大列表负担过重。我试图通过在 reducer 中设置过滤列表来解决这个问题,事实证明这要快得多。此外,由于这还不够敏捷,而不是改变过滤列表,我创建了另一个列表,其中显示的项目的 ids 我用来为过滤项目设置隐藏的 css 类。我会在某个时候看一下react-virtualized,但现在我将专注于其他事情。这是网站顺便说一句。 kurssim.me
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-09
  • 2019-08-27
  • 2021-07-12
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多