私は同様の問題を抱えており、それを回避するための一種のハックを見つけました。
フィルターのセットが複雑で、フィルター処理するアイテムが膨大な数にあります。フィルター状態の一部には、表示状態が含まれます。表示状態の変化を無視したいので、常に巨大なリストをフィルタリングしません。これは簡単な解決策です:
const getFilters = createSelector(
state => state.filters,
filters => {
const filtersWithoutDisplay = {};
const ignoreObj = { collapsed: null };
for (let filterGroup in filters) {
filtersWithoutDisplay[filterGroup] = Object.assign({}, filters[filterGroup], ignoreObj);
}
// We create a new object every time, so this cannot be memoized properly unless we stringify.
return JSON.stringify(filtersWithoutDisplay);
}
);
解析する必要がある JSON 文字列を返しますが、これはプリミティブであるため、別のセレクターへの入力として、実際の内容が変更されない場合は再計算をトリガーしません。それは一種のハックです。
createSelectorCreator
ここで説明されているように、セレクター関数の外部でオブジェクトを定義し、常に同じ参照を保持し、この同じパターンに従って内部を変更し、プルしてカスタムの深い等値チェックを使用することもできますhttps://github.com/ reactjs/reselect#q-why-is-my-selector-recomputing-when-the-input-state-stays-the-same . これはおそらくより良い方法ですが、それが言うように:
代替の equalityCheck 関数または状態更新関数の詳細な等価性チェックのコストが、毎回再計算するコストよりも大きくないことを常に確認してください。
これは、JSON.stringify ハックにも当てはまります。私は巨大なリストに対してはしませんが、フィルターに対しては確かにそうします。
私の状況では、フィルター値はフィルター表示設定とは別の問題である可能性があり、これを分離したいのはこれだけではない可能性があるため、状態をリファクタリングすることをお勧めします。