1

我有一个约 5000 个元素的列表,我想过滤它,searchPhrase由用户给出。通常用户输入过滤短语的第一个字母,然后是第二个,然后是第三个。例如用户类型'a',然后'ab',然后'abc'

我正在尝试使用 reactjs/reselect 库来提高过滤性能。我在自述文件中的示例中使用了这个库: 示例 我改变了这个方法:

export const getVisibleTodos = createSelector(
  [ getVisibilityFilter, getTodos ],
  (visibilityFilter, todos) => {
    switch (visibilityFilter) {
      case 'SHOW_ALL':
        return todos
      case 'SHOW_COMPLETED':
        return todos.filter(t => t.completed)
      case 'SHOW_ACTIVE':
        return todos.filter(t => !t.completed)
    }
  }
)

对该实施:

export const getVisibleTodos = createSelector(
    [getSearchPhrase, getTodos],
    (searchPhrase, todos) => {
        return todos.filter((x) => {
            return x.firstName.indexOf(searchPhrase) >= 0;
        });
    }
)

我注意到每次用户键入下一个字母todos.length属性时都是相同的。不应该在更长todos.length的时候更短吗?searchPhrase我认为没有 reactjs/reselect 的性能是一样的。

todos当先前searchPhrase是实际的子字符串时,是否有可能过滤较短的列表searchPhrase

4

1 回答 1

1

这不是 reselect 提高性能的方式:todos 的实际过滤在有或没有 reselect 的情况下所花费的时间完全相同。

reselect 为您做的是记住过滤:只要返回相同的值(由相等定义getSearchPhrase) ,多次调用只会过滤一次。getTodos===getVisibleTodos

这在一个复杂的应用程序中很重要,您对 redux 状态有许多不相关的更改:如果不重新选择任何状态更改将导致所有选择器再次运行,即使该部分状态未更改。

于 2017-05-04T12:28:55.713 回答