2017-03-24 15 views
0

animalsは還元店にあるとします。これは正規化されたオブジェクトであり、キーはidであり、値はオブジェクト自体です。各動物はキーis_dogを有する。潜在的に高価な計算プロパティの再計算を避ける方法

animals: { 
    'id1': { location: 'foo', is_dog: true, name: 'Dog1' }, 
    'id2': { location: 'foo', is_dog: false, name: 'Cat1' }, 
    'id3': { location: 'foo', is_dog: false, name: 'Cat2' }, 
    'id4': { location: 'foo', is_dog: true, name: 'Dog2' }, 
} 

Iが接続DogsListは、ストアの状態を見て、UIコンポーネントにdogIdsの配列を渡す成分を反応させました。

dogIds = _.chain(state.animals).filter('is_dog').map('id').value();

['id1', 'id4']を返します。この上記の例では:dogIdsの計算のようなものです。

しかし、のは、私は動物の数千を持っていると仮定しましょう、そして各動物は、私はdogIdsが唯一の任意の動物のためであればis_dog変更が変わることを知っているなど、lastFedcurrentLocation言って、頻繁に変更される他の特性を有しているが、私はありませんよどんな動物への変更にもフィルタやマップの計算を不必要にしないでください。私はreselectを使ってみましたが、私はそれが本当にこの場合に役立つとは思わない。

私はdogIdsを適切なreduxに格納することに傾いており、関連する場合にのみ手動で更新します。新しい犬がanimalsに追加されたとき、または猫が犬に変わったとき(私の類推はここでは崩れている)のように。しかし、私はreduxストアで計算されたプロパティを保持することによって何か間違っているように感じる。

答えて

1

おそらく、shouldComponentUpdateのようなReactのライフサイクルメソッドを使用して調べることができます。ここでは、newDogIDs !== oldDogIDsかどうかを評価し、異なる場合にのみ処理します。

+0

ありがとう、それは良いフィードバックです。私が避けようとしていたのは実際の 'フィルター'計算ですが、私はそれについてもっと考えるほど、何百万という動物がいない限り、それほど高価にならないようです。 –

+0

あなたの質問を誤解しているかもしれないと思う。あなたの動物のリストが更新されるたびにその計算を実行する必要があります。そうしないと、犬が猫になったかどうかわからなくなります。 – rorymorris89

+0

1)動物の追加/削除、2)動物の種類の変更(犬から猫への変更)のアクションを扱っている場合、あなたが 'dogsList'を再計算する必要がある時を知っておく必要があります、 必要がない) – rorymorris89

関連する問題