2

也许这不一定是重选题

const makeSelectError = () => createSelector(
  selectGlobal,
  (globalState) => globalState.get('error')
);

在重新选择中我们使用

const mapStateToProps = createStructuredSelector({
  error: makeSelectError(),
});

为什么我们不能像下面这样使用?

const makeSelectError = createSelector(
      selectGlobal,
      (globalState) => globalState.get('error')
    );

并在重新选择中使用如下

const mapStateToProps = createStructuredSelector({
  error: makeSelectError,
});

我的代码是否有任何问题/缺点,或者这是一种标准做法?

4

2 回答 2

3

第二种方法不仅有效且正确,而且还有其他优点。

使用您提供的第一个片段:

const makeSelectError = () => createSelector(
  selectGlobal,
  (globalState) => globalState.get('error')
);

makeSelectError是一个工厂函数,每次调用它都会返回一个新的唯一选择器。

这意味着每次mapStateToProps调用一个简单的函数时都会创建一个新的选择器,并再次计算选择器的结果。这意味着您将失去记忆的主要好处reselect

因此,对于简单的情况,您只需执行以下操作:

const getSomePieceOfState = state => state.someArea.someDetail;
const getAnotherPieceOfState = state => state.anotherArea.anotherItem;

const getSomeCombinedState = createSelector(
  getSomePieceOfState,
  getAnotherPieceOfState,
  (somePiece, anotherPiece) => somePiece + anotherPiece
);

const mapStateToProps = state => ({
  someProp: getSomeCombinedState(state)
});

笔记。通常在选择器名称前加上get. 前缀,在选择器工厂(返回选择器的函数)的名称前加上makeGet.

有时创建选择器工厂是必要的,但如果您不想创建依赖于不在状态中的属性的选择器。

你可以在这里阅读更多关于在选择器中访问 React Props

于 2017-11-08T23:10:37.417 回答
1

你在第二个例子中做的绝对正确。这是一种标准做法。

无需换makeSelectError行到另一个函数。

于 2017-08-26T11:08:40.350 回答