在我的容器组件之一的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;
},
);
感谢您提供的任何帮助!