如何使用带有 createSelectorCreator() 的 Reselect 来记忆(深度比较)Redux 对象?

gps*_*ugy 6 memoization reactjs react-redux reselect

情况

使用 React Redux,在mapStateToProps我的一个容器组件中,为了方便起见,我传递了一个具有 8 个以上键的对象。(我知道向下传递对象是一种反模式,但在我的例子中,传递单个对象而不是许多单独的 props 的便利性非常重要。)

问题

您可以使用reselectmemoize 整个对象来传递mapStateToProps,仅通过深度比较整个对象来传递它吗?如果是这样,正确的方法是什么?

我的尝试

我已阅读reselect文档部分“为 defaultMemoize 自定义 equalsCheck”,并阅读了许多尝试使用记忆数组reselect的帖子。基于这些知识,我尝试执行以下操作,但没有成功:

import _ from 'lodash';
import { createSelector, createSelectorCreator, defaultMemoize } from 'reselect'

const createDeepEqualSelector = createSelectorCreator(
  defaultMemoize,
  _.isEqual,
);

const getLargeObject = createDeepEqualSelector(
  (state) => {
    // Get the individual values from state
    const {
      val1, val2, val3, val4, val5, val6, val7, val8, val9, val10
    } = state;

    // Create a convenient object that contains all of those values to pass down to props
    const constructedObject = {
      val1, val2, val3, val4, val5, val6, val7, val8, val9, val10
    };

    return constructedObject;
  },
  constructedObject => constructedObject,
);

const mapStateToProps = (state, ownProps) => {
  const objProp = getLargeObject(state);

  return {
    objProp,
    // ... other props
  };
}
Run Code Online (Sandbox Code Playgroud)

(不幸的)替代方案

如果我不这样做,我最终会得到 8 个以上的单独选择器,并进行大量createSelector调用。这似乎比必要的多余,让我想知道是否有更好的方法来做到这一点。作为演示:

const getVal1 = (state) => state.val1;
const getVal2 = (state) => state.val2;
...

const getLargeObject = createSelector(
  [
    getVal1,
    getVal2,
    ...
  ],
  (
    val1,
    val2,
    ...
  ) => {
    const largeObject = {
      val1,
      val2,
      ...
    };

    return largeObject;
  },
);
Run Code Online (Sandbox Code Playgroud)

感谢您提供的任何帮助!