Ответ
Actions — это простые объекты, которые описывают событие в приложении. Они содержат обязательное поле type и могут включать дополнительные данные (payload).
Reducers — это чистые функции, которые принимают текущее состояние и action, возвращают новое состояние. Они определяют, как состояние изменяется в ответ на action.
Пример:
// Action
const increment = { type: 'INCREMENT', payload: 1 };
// Reducer
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + action.payload;
default:
return state;
}
}
Ключевые отличия:
- Actions — это события, reducers — обработчики.
- Actions не изменяют состояние, reducers — да.
- Reducers должны быть чистыми (без side effects).
Ответ 18+ 🔞
Ну, слушай, вот есть у тебя приложение, да? И в нём постоянно какая-то хуйня происходит: пользователь кнопку тыкнул, данные с сервера припёрлись, таймер сработал. Так вот, эта вся хуйня — это и есть события, или, на нашем языке, экшены (actions).
Экшен — это просто такой бумажный самолётик, в котором написано, что случилось. У него обязательно должна быть бумажка с надписью type, ну, чтобы понятно было, что за событие. А ещё в него можно запихнуть дополнительные бумажки — payload (полезную нагрузку). Всё, больше от него нихуя не требуется. Он просто летит и кричит: «Эй, случилось вот это!»
// Вот смотри, летит самолётик-экшен. Кричит: "ИНКРИМЕНТ!"
const increment = { type: 'INCREMENT', payload: 1 };
А теперь, внимание, появляется второй персонаж — редьюсер (reducer). Представь себе самого спокойного и законопослушного бухгалтера на свете. У него на столе лежит текущий баланс (state). В окошко влетает бумажный самолётик (action). Бухгалтер его ловит, смотрит на бумажку type и говорит: «Ага, „ИНКРИМЕНТ“. Значит, к текущему балансу надо прибавить то, что в payload». И аккуратно, чётко, по правилам, выводит новый баланс. Он никогда не портит старый баланс, он всегда создаёт новый листочек с новым числом. И главное — он чистая функция, то есть никаких левых звонков, никаких внезапных изменений данных на стороне. Только математика, сука!
// А вот и наш бухгалтер-редьюсер. Спокойный, как удав.
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT':
return state + action.payload; // Всё по правилам, новый листок.
default:
return state; // Если самолётик непонятный — игнорируем, баланс не трогаем.
}
}
Короче, разница на пальцах:
- Экшен (Action) — это событие. Кричит «Что случилось!». Сам он нихуя не меняет.
- Редьюсер (Reducer) — это обработчик. Сидит, слушает эти крики, и по чётким правилам решает, как поменять состояние. Он единственный, кому можно его трогать.
- Главная заповедь редьюсера: будь чистым, ёпта! Никаких побочных эффектов. Пришёл старый state и action — ушёл новый state. Всё.
Вот и вся магия. Экшены носятся, орут, а редьюсеры их успокаивают и аккуратно пересчитывают циферки. Без этой дисциплины был бы пиздец, а не приложение.