React&Reselect选择器声称更新后的状态是相同的

时间:2018-09-05 07:03:58

标签: reactjs redux react-redux reselect

我正在项目中实现Reselect,并且对如何正确使用它有些困惑。在阅读了有关如何使用重新选择的多个教程和文章之后,我使用了相同的模式,但是仍然有些东西无法按预期工作。

我的选择器:

const getBaseInfo = (state) => state.Info;
const getResources = (state) => state.Resources;

export const ASelector = createSelector(
  [getBaseInfo, getResources],
  (items, resources) => { 
    let result = {};
    for(const item in items) {
      console.log(item);
      result[item] = _.pick(items[item], ['Title', 'Type', 'Beginning', 'minAmount', 'Address'])
    }
    for(const item in resources) {
      console.log(item);
      result[item] = {...result[item], firstImage: resources[item].firstImage}
    }
    return result;
  }
);

mapStateToProps组件:

function mapStateToProps(state) {
  console.log(state);
  return { 
    gridInfo: ASelector(state)
  }
}

现在起初我的初始状态是:

state = { Info: {}, Resources: {} }

我的减速器:

const Info = ArrayToDictionary.Info(action.payload.data.Info);
  const Resources = ArrayToDictionary.Resources(action.payload.data.Info);
  let resourcesKeys = Object.keys(Resources);
  let infoKeys = Object.keys(Info);
  let temp = { ...state };
  let newInfo;

  for (let item of infoKeys) {
    newInfo = {
      Title: Info[item].Title,
      Type: Info[item].Type,
      BeginningOfInvesting: Info[item].BeginningOfInvesting,
      DateOfEstablishment: Info[item].DateOfEstablishment,
      pricePerUnit: Info[item].PricePerUnit,
      minUnits: Info[item].MinUnits,
      publicAmount: Info[item].PublicAmount,
      minInvestmentAmount: Info[item].MinInvestmentAmount,
      EinNumber: Info[item].EinNumber,
      Address: Info[item].Address,
      Status: Info[item].Status,
      Lat: Info[item].Lat,
      Lng: Info[item].Lng,
      CurrencySymbol: Info[item].CurrencySymbol,
      Publicity: Info[item].Publicity
    }
    temp.Info[item] = { ...temp.Info[item], ...newInfo }
  }
  for (let item of resourcesKeys) {
    temp.Resources[item] = { ...temp.Resources[item], ...Resources[item] }
  }
  return temp;

当组件以初始状态进行渲染时,我有一个动作将从api中提取数据并将其相应地保存到reducers内部的状态。

现在我的状态已更改,但是在对重新选择的代码进行了一些调试之后,我在比较函数中发现新旧状态是相同的。 突然,我的“旧”状态已经被newState数据填充,并且当它们变得相同时,当然无法进行比较。

我的选择器有问题吗?

我确实曾尝试将其用作文档说明,但仍然无法理解如何解决我的小问题。

非常感谢您的阅读和帮助!

1 个答案:

答案 0 :(得分:3)

看起来temp.Info[item]temp.Resources[item]行正在改变现有状态。您已经复制了顶层的浅层副本,但是没有正确复制第二层。请参阅Redux文档中的Immutable Update Patterns页,以获取有关这是一个问题以及如何解决的解释。

您可能想尝试使用immer库来简化您不变的更新逻辑。另外,我们新的redux-starter-kit库在内部使用Immer。