如何使用reselect与createSelectorCreator()来记忆(深度比较)Redux对象?

时间:2019-10-17 20:52:33

标签: reactjs react-redux memoization reselect

情况

在我的容器组件之一的mapStateToProps中,使用react redux,为了方便起见,我使用8个以上的键向下传递了一个对象。 (我知道将对象向下传递是一种反模式,但在我的情况下,传递单个对象而不是许多单独的道具很方便。)

问题

您是否可以使用reselect来记住要通过mapStateToProps的整个对象,而仅通过深度比较整个对象来向下传递?如果是这样,这样做的正确方法是什么?

我的尝试

我已经阅读了reselect文档部分“为defaultMemoize自定义equityCheck”,并通读了许多文章,其中尝试使用reselect来记忆 array 制作。基于此知识,我尝试执行以下操作,但未成功:

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
  };
}

(不幸的)替代方式

如果我不做事,我最终会得到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;
  },
);

感谢您提供的任何帮助!

0 个答案:

没有答案