Зачем возвращать регистр по умолчанию вместо броска в редуктор Redux? - PullRequest
0 голосов
/ 27 апреля 2019

Я прочитал много учебников по Redux, все учебники возвращают регистр по умолчанию вместо throw, они пишут что-то вроде этого:

const counter = (state = 0, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1;
    case 'DECREMENT':
      return state - 1;
    default:
      return state;
  }
};

Почему бы не выдать ошибку, поскольку мы уже знаем, что разработчик должен был отправить несуществующий тип действия? как это:

const counter = (state = 0, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1;
    case 'DECREMENT':
      return state - 1;
    default:
      throw new Error(`Unknow action type: ${action.type}`)
  }
};

Почему бы не бросить?

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

В случае Redux у вас может быть несколько редукторов, которые вы комбинируете, используя combineReducers для формирования одного хранилища. Когда вы отправляете действие, оно отправляется всем редукторам и только предполагаемому. Следовательно, у вас будет случай по умолчанию, в котором вы вернете текущее состояние.

И пока действие отправляется всем редукторам, только тот, кто должен его обработать, прослушивает его и обновляет состояние. Это может привести к тому, что действие будет отправлено, но не обработано каким-либо редуктором, но, безусловно, не вызовет проблемы и никогда не произойдет, если вы не забудете написать этот код.

Однако, если вы используете один редуктор без их объединения, что часто имеет место с useReducer ловушкой, вы можете выдать ошибку, если не отправлено соответствующее действие.

1 голос
/ 27 апреля 2019

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

const hiringProcess = (oldListOfCandidates, action) => {
  if (action.type === 'CREATE_CANDIDATE') {
    // we care about this action
    return [...oldListOfCandidates, action.payload];
  }
   // we don't care about this action
}

Итак, с синтаксисом ES2015 я взял массив oldListOfCandidates и добавил их в новый массив, а затем добавил новую запись action.payload.

В любом случае, ваш вопрос не о синтаксисе интерполяции клавиш, а о том, почему return state; вместо того, чтобы выдавать ошибку.

Мы не заботимся о том, чтобы вернуть ошибку, для целей редукторов и того, что должна делать для нас общая архитектура редуксов, что мы хотим вернуть, это существующие данные или state, если у нас нет новые данные, вот и весь смысл этих редукторов.

const hiringProcess = (oldListOfCandidates, action) => {
  if (action.type === 'CREATE_CANDIDATE') {
    // we care about this action
    return [...oldListOfCandidates, action.payload];
  }
   // we don't care about this action
   return oldListOfCandidates;
}

Так что, если нет нового кандидата для добавления в state, тогда нам не нужна или не нужна ошибка, объясняющая, почему не обновили state, мы просто хотим return state;, который у нас уже есть.

И, как вы уже знаете, при первом вызове редуктора он получит значение undefined, и нам нужно значение по умолчанию для первого аргумента для state только так:

const hiringProcess = (oldListOfCandidates = [], action) => {
  if (action.type === 'CREATE_CANDIDATE') {
    // we care about this action
    return [...oldListOfCandidates, action.payload];
  }
   // we don't care about this action
   return oldListOfCandidates;
}

Я говорю за state только потому, что я выполнил работу в магазинах, где они установили значение объекта action по умолчанию и не могли объяснить мне, почему они это сделали, и в то же время не удосужились его исправить. так что не делайте этого, это не обязательно.

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