В чем разница между Redux и React Context?
Контекст и State managers
Сравнение не совсем корректное по уровню: Context — механизм доставки данных по дереву, Redux — полноценная система управления состоянием. Пересекаются они только в задаче «избежать prop drilling».
Что такое каждый
- React Context — встроенный транспорт: провайдер кладёт value, потомки читают через useContext. Самого «управления состоянием» нет — состояние живёт в useState/useReducer.
- Redux — стор вне дерева + строгий однонаправленный поток (dispatch action → reducer → новое состояние) + подписки; Redux Toolkit добавляет удобный API, девтулзы, middleware.
Отличия
- Подписки: useContext перерендеривает всех потребителей при любом изменении value; Redux
useSelector— только компоненты, чей выбранный кусок изменился. - Логика обновлений: в контексте — произвольная (сеттеры), в Redux — централизована в редьюсерах, тестируется отдельно.
- Инструменты: Redux DevTools (история экшенов, time travel), middleware (логирование, сайд-эффекты); у контекста ничего этого нет.
- Бойлерплейт: контекст — ноль зависимостей и минимум кода; Redux — заметная инфраструктура (слайсы, стор, провайдер).
- Забавный факт: react-redux сам использует Context, но лишь для передачи инстанса стора, подписки идут мимо контекста.
Когда что выбирать
- Context: редко меняющиеся «окружающие» данные — тема, локаль, текущий пользователь, DI сервисов.
- Redux (или Zustand): сложное, часто обновляемое состояние со множеством потребителей и взаимосвязанной логикой — корзина, редактор, realtime-данные.
- Серверные данные — вообще React Query, не то и не другое.
Коротко для собеседования
Context — транспорт значений по дереву без селекторов: любое изменение будит всех потребителей; состояние им не «управляется». Redux — внешний стор с точечными подписками, централизованными редьюсерами и девтулзами. Тема/локаль/пользователь — контекст; сложное динамичное состояние — Redux/Zustand.