我有一个普通的选择器,它只是用来获得状态的一部分:
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)
它是否有任何意义,如提高性能?在我看来,包装是不必要的.
不,仅创建备忘录选择器只是为了获得状态树的一部分是没有意义的。
原因是connect
它将对从中传入的每个道具进行自己的浅层相等性检查mapStateToProps
。如果选择器返回的道具与其他道具一起通过了浅层相等性检查,则render
不会不必要地调用该道具。如果选择器简单地返回了状态树的一部分,而状态树的那一部分尚未被修改,则进行浅层相等性检查就足够了。
但是,如果选择器是根据其他选择器的结果计算得出的,那么使用createSelector
是一个不错的选择。首先,它为组合选择器提供了一种不错的语法。其次,如果组合选择器的计算可能会很昂贵,那么您将获得性能收益。第三,如果选择器要返回一个新的但等价的对象或数组,则提供的浅层相等性检查connect
是不够的。在那种情况下,createSelector
提供的备忘录将确保如果输入没有更改,则返回相同的对象或数组实例,然后进行浅层相等性检查将足以避免代价高昂的重新渲染。
因此,仅公开状态树的部分createSelector
不会添加任何内容。
对于几乎所有从状态树的多个部分计算出的选择器,都createSelector
开始增加价值。它所增加的值的数量根据选择器的不同而不同,从更容易阅读到确保不必不必要地重新渲染组件树。
归档时间: |
|
查看次数: |
900 次 |
最近记录: |