重新选择 - 创建一个仅用于获取状态的记忆选择器是否有意义?

Jas*_* Xu 8 redux reselect

我有一个普通的选择器,它只是用来获得状态的一部分:

export const getAllPosts = state => {
  return state.posts;
};
Run Code Online (Sandbox Code Playgroud)

如果我使用重新选择来包装选择器:

import { createSelector } from 'reselect';

export const allPosts = createSelector(
  getAllPosts,
  (posts) => posts
);
Run Code Online (Sandbox Code Playgroud)

它是否有任何意义,如提高性能?在我看来,包装是不必要的.

Cha*_*upt 7

不,仅创建备忘录选择器只是为了获得状态树的一部分是没有意义的。

原因是connect它将对从中传入的每个道具进行自己的浅层相等性检查mapStateToProps。如果选择器返回的道具与其他道具一起通过了浅层相等性检查,则render不会不必要地调用该道具。如果选择器简单地返回了状态树的一部分,而状态树的那一部分尚未被修改,则进行浅层相等性检查就足够了。

但是,如果选择器是根据其他选择器的结果计算得出的,那么使用createSelector是一个不错的选择。首先,它为组合选择器提供了一种不错的语法。其次,如果组合选择器的计算可能会很昂贵,那么您将获得性能收益。第三,如果选择器要返回一个新的但等价的对象或数组,则提供的浅层相等性检查connect是不够的。在那种情况下,createSelector提供的备忘录将确保如果输入没有更改,则返回相同的对象或数组实例,然后进行浅层相等性检查将足以避免代价高昂的重新渲染。

因此,仅公开状态树的部分createSelector不会添加任何内容。

对于几乎所有从状态树的多个部分计算出的选择器,都createSelector开始增加价值。它所增加的值的数量根据选择器的不同而不同,从更容易阅读到确保不必不必要地重新渲染组件树。