Состояние претензий React & Reselect селектора остается неизменным после обновления - PullRequest
0 голосов
/ 05 сентября 2018

Я внедряю 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 и сохраняющее их соответственно в состояние внутри редукторов.

Теперь мое состояние изменилось, но после небольшой отладки в коде повторного выбора я обнаружил в функции сравнения, что старое и новое состояния совпадают. Внезапно мое «старое» состояние стало уже заполненным данными newState, и, конечно, сравнение не удалось, поскольку они стали одинаковыми.

Что-то не так с моими селекторами?

Я действительно пытался использовать его в соответствии с документацией, но все еще не могу понять, как решить мою маленькую проблему.

Большое спасибо за чтение и помощь!

1 Ответ

0 голосов
/ 06 сентября 2018

Похоже, что строки temp.Info[item] и temp.Resources[item] изменяют существующее состояние. Вы сделали поверхностную копию верхнего уровня, но неправильно копируете второй уровень. См. Страницу Шаблоны неизменных обновлений в документации Redux, чтобы узнать, почему это проблема и что вместо этого нужно делать.

Возможно, вы захотите попробовать использовать библиотеку immer, чтобы упростить логику неизменного обновления. Кроме того, наша новая библиотека redux-starter-kit использует Immer для внутреннего использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...