Какие есть альтернативы React контекста и в каких случаях их выбирать?
Контекст и State managers
Контекст хорош для редких обновлений; когда его минусы (перерендер всех потребителей, отсутствие селекторов) мешают, выбирают одну из альтернатив.
Композиция вместо контекста
Часто prop drilling убирается не контекстом, а перестройкой дерева: собрать содержимое там, где данные есть, и передать через children/слоты.
<Layout sidebar={<Menu user={user} />} /> // промежуточные уровни не знают о userВыбирать: когда данные нужны в одном-двух местах, а мешает только транзитная передача. Нулевая цена, никакой инфраструктуры.
Стейт-менеджер с селекторами (Zustand, Redux Toolkit, Jotai)
const count = useCart((s) => s.items.length); // точечная подпискаВыбирать: состояние общее для многих несвязанных частей и часто меняется (корзина, редактор, realtime). Даёт точечные ререндеры, централизованную логику, девтулзы. Цена — зависимость и инфраструктура.
Серверный кеш (TanStack Query / SWR)
Выбирать для всего, что приходит с сервера: данные шарятся через кеш по ключу (дедупликация, фоновое обновление), а не через контекст/стор.
Точечная подписка вручную: useSyncExternalStore
Свой маленький стор + подписка — когда не хочется зависимости, а контекст «будит всех». Так внутри устроены Zustand и react-redux.
Разделение контекстов (митигация, а не альтернатива)
Разбить один Provider на несколько (данные/действия, быстрые/медленные), мемоизировать value. Часто этого достаточно, чтобы контекст остался пригодным.
Как выбирать
Транзитная передача → композиция. Редкие глобалки (тема, юзер, локаль) → Context. Частые обновления и много потребителей → стор с селекторами. Данные сервера → React Query.
Коротко для собеседования
Альтернативы: композиция/слоты (убирает саму причину prop drilling), стейт-менеджер с селекторами для часто меняющегося общего состояния, React Query для серверных данных, useSyncExternalStore для своих сторов. Плюс митигация — разделение контекстов и мемоизация value.