Redux не обязателен. Состояние можно разделять через локальный подъём, Context, легковесные сторы и серверный кэш — выбор зависит от частоты обновлений и области видимости.
Практический стек без Redux
Lifting state up — общий предок держит state, детям пропсы. Идеально для маленьких деревьев.
React Context — тема, locale, текущий user. Плохо, если значение меняется очень часто (все потребители ре-рендерятся).
useReducer + Context — «мини-Redux» на ветке UI без бойлерплейта.
Внешние сторы: Zustand, Jotai, Valtio — селекторы, меньше ре-рендеров, простой API.
Серверное состояние: TanStack Query / SWR — кэш, revalidate, dedupe; «глобальность» данных с бэка.
URL как state — фильтры/табы в query string (разделяются и шарятся естественно).
constCtx = createContext(null);
functionProvider({ children }) {
const value = useReducer(reducer, initial);
return<Ctx.Providervalue={value}>{children}</Ctx.Provider>;
}
Критерий выбора
Локальный UI → useState.
Редко меняющийся «сеанс» → Context.
Частое глобальное клиентское → внешний store.
Данные с API → Query, не Redux «на всякий случай».
Зрелый ответ: Redux оправдан при сложной клиентской доменной логике, time-travel, большом числе middleware — иначе часто overkill.