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.