приставка не вызывает mapStateToProps при обновлении магазина - PullRequest
0 голосов
/ 08 февраля 2019

Не используйте push при обновлении вашего состояния.Используйте concat

Я сталкиваюсь с этой действительно странной проблемой, рассмотрим этот редуктор:

export default function(state = null, action) {

  console.log("Current State: ",state);
  // on performing actions, it gives me:
  // Current State: null
  // Current State: Array [{}]
  // Current State: Array [{}] -- all good

  if(state === null) {
      state = [
          {id: 1, title: "Java"}
      ];
  }

  // UPDATED PART. FORGOT TO MENTION IT BEFORE
  if(Action.type == "UPDATE_LIST") {
     state.push( Action.payload ); // don't do that, this'll mutate your array and states are immutable
  }
  /////////////

  return state; // this is the main problem
}

Приведенный выше код не вызывает mapStateToProps внутри моего компонента.Однако изменение вышеуказанного редуктора, как показано ниже, вызывает mapStateToProps:

return []; // instead of return state;

ИЛИ

return [ {id: 1, title: "Python"} ]; // instead of return state;

Я возвращаю instanceof Array в обоих случаях [state & []],но только последний вызывает в моем компоненте mapStateToProps.

Это странно, и я понятия не имею, что мне делать, чтобы это исправить.

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Смысл избыточности в том, чтобы гарантировать, что ваше состояние не может быть изменено напрямую.Поскольку массивы и объекты передаются по ссылке в Javascript, ваш код пытается изменить объект состояния напрямую, что неверно.

Всегда изменяйте состояние, возвращая новое состояние.Как это:

export default function(state = null, action) {
  let newState = [...state];
  if(state === null) {
      newstate = [
          {id: 1, title: "Java"}
      ];
  }

  return newState;
}
0 голосов
/ 08 февраля 2019

делай так:

 if(state === null) {
      state = [
          {id: 1, title: "Java"}
      ]; 
      return state;
  }

  return state;
...