1

ngrx を使用してIonic2アプリを開発しています。

私のストアからデータを選択するには、reselectを使用しています。

同じデータ (同じレデューサーから) を使用するページがいくつかありますが、現在のページに応じて、他のレデューサー データと組み合わせて使用​​します (これは、各ページに独自のリセレクターがあることを意味しますが、このセレクターのそれぞれには少なくとも 1 つのセレクターがあります)。したがって、これらの引数の 1 つが変更されるたびに、これらのページのすべてのリセレクターを再計算する必要があります)。

次のようになります。

page1 = createSelector(fromState1.getData, fromCommonState.getData,(data, commonData) => {...});
page2 = createSelector(fromState2.getData, fromCommonState.getData,(data, commonData) => {...});
page3 = createSelector(fromState3.getData, fromCommonState.getData,(data, commonData) => {...});

私が懸念しているのは、共通の状態が変化するたびに多くのページがある場合、現在のページで使用されているセレクターを再計算する必要がある場合でも、すべてのセレクターが再計算されることです。セレクターが複雑なことを行う必要がある場合、これは大きなパフォーマンスの問題になる可能性があると思います。

そのページに戻るまでストアからの更新を「一時停止」する方法はありますか? このようにして、現在のページのセレクターのみが再計算されます。

または、不要な計算を回避する別の方法はありますか?

4

1 に答える 1

0

セレクターがアプリ全体(または複数のスマート コンポーネント) で使用される場合は、共通ファイル (selectors.ts) にセレクターを作成します。あなたの場合、シンプルに保ち、セレクターをスマートコンポーネント (ページ) に配置してみませんか? そうすれば、必要なときにのみ計算され、購読されます。

reselectObservables を使用していないライブラリで頻繁に使用され、状態が変化するたびにデータが実際にプッシュされます。ngrx のようなライブラリでは、大量のデータを操作しない限り、このゲインは無視できます。私にとって、これは時期尚早の最適化です。

状態を一時停止するには、ストアのどこかで現在のページの状態を維持し、フィルターを使用して、状態のページが一致する場合にのみ重いアクションを実行します。

let page3 = createSelector(
fromState3.getData, fromCommonState.getData,
(data, commonData) => {
    if(fromState3.selected) { 
      // Large computation
    }
});
于 2016-12-20T01:40:43.620 に答える