2017-11-07 7 views
3

私はちょうど状態の一部を取得するために使用される通常のセレクタ持っている:私はセレクタをラップするために再選択を使用している場合再選択 - 状態の一部を取得するために使用された記憶されたセレクタを作成することは理にかなっていますか?

export const getAllPosts = state => { 
    return state.posts; 
}; 

を:

import { createSelector } from 'reselect'; 

export const allPosts = createSelector(
    getAllPosts, 
    (posts) => posts 
); 

そのような向上など何の意味も持ちませんパフォーマンス?私の意見では、ラッパーは不要です。

+0

偉大な質問 - 私はこれをどこでも解決できませんでした。 –

答えて

1

はありません、それが作成しても意味がありません。私が見つけた何

は私の最初のレベルのセレクタはメモ化されるように、単にプレーンの機能があり、その必要性より深く行くの任意のセレクタということですステートツリーの一部を取得するためのメモ型セレクタ。

connectは、mapStateToPropsから渡された各小道具について、それ自身の浅い等価性チェックを行います。セレクタによって返された小道具が他の小道具と共にその浅い平等チェックを通過する場合、renderは不必要に呼び出されません。セレクタが単純に状態ツリーの一部を返し、状態ツリーのその部分が変更されなかった場合、浅い等価チェックで十分です。

セレクタが他のセレクタの結果から計算される場合は、createSelectorを使用するとよいでしょう。まず、セレクタを作成するための素晴らしい構文を提供します。第2に、セレクタを組み合わせる計算が潜在的に高価な場合は、パフォーマンスの向上が得られます。第3に、セレクタが新しい、等価な、オブジェクトまたは配列を返す場合、connectによって提供される浅い等価チェックでは十分ではありません。その場合、createSelectorが提供するメモは、入力が変更されていない場合に、同じオブジェクトまたは配列インスタンスが返されたことを保証します。次に、浅い等価チェックで高価な再レンダリングを回避するのに十分です。

状態ツリーの一部を公開するだけのため、createSelectorは何も追加しません。

状態ツリーの複数の部分から計算されるほぼすべてのセレクタに対して、createSelectorは値の追加を開始します。追加する価値の量は、コンポーネントツリーを不必要に再レンダリングしないように、読みやすいようにセレクタに基づいて異なります。

0

いいえ、実際のメリットはありません。

// assume state is: {first : {second {} } } 

const selectFirst = state => state.first; 

const selectSecond = createSelector(
    selectFirst, 
    first => first.second 
); 
+0

なぜselectSecondを記憶すべきですか?明らかなパフォーマンスの改善は見られません。もっと説明していただけますか? –

+0

この例はかなり簡単でした。しかし、 'selectSecond()'の出力セレクタが高価な作業(配列の並べ替え/フィルタリング)を行っていると仮定し、配列が変更されたときにのみそれを実行したいとします。 'createSelector()'を使って入力をメモすると、入力セレクタが変更されたときだけ出力セレクタが実行されます。 – markerikson

0

あなたがそれを変更しない限り、常に自分自身と同じ(またはそれ以前の状態)に等しい同じ参照をストアから返すだけなので意味がありません。

あなたがたとえば、あなたが代わりに店で配列のオブジェクト内のあなたの実体を格納していますが、あなたのコンポーネントに配列を返すようにしたいシナリオを別のシナリオを想像するなら、あなたはデータを導出する必要があります。

export const selectAllPosts = createSelector(
    getAllPostsFromStore, // returns { 1: {...}, 2: {...} } 
    (allPosts) => Object.keys(allPosts).map(key => allPosts[key]) 
); 

セレクタがパフォーマンスの向上に変わったのは、ストア内の何かが変更された場合にのみ派生データを計算するためです。

私の経験則は次のとおりです。データを派生しない場合は、メモをとる必要はありません。

関連する問題