foundation

Reducers

Пишите чистые переходы состояния, возвращающие следующее состояние из предыдущего и action.

Reducers — чистые функции `(state, action) => nextState`. Без сети, без `Date.now()`, без мутации аргументов. Combined reducers делят состояние по slice; каждый slice владеет своим поддеревом.

					function todosReducer(state = [], action) {
  switch (action.type) {
    case 'todos/added':
      return [...state, action.payload];
    default:
      return state;
  }
}
				

С Immer внутри `createSlice` пишете обновления «как с мутацией», получая иммутабельный снимок. Для неизвестных actions возвращайте прежний `state` — стабильность ссылок.

Компромисс: чистые тестируемые переходы против многословности; Immer меняет видимость чистоты на эргономику.

На интервью: докажите чистоту — одинаковые входы → одинаковый выход; зачем default branch возвращает прежнее состояние.

Типовые ошибки: побочные эффекты в reducer, общий мутабельный initial state, запись в чужой slice из reducer.

Чеклист:

  • Только чистые переходы.
  • Один reducer на домен slice.
  • Default case — прежнее состояние.
  • Immer для вложенных обновлений в RTK.