PassFront
  1. PassFront
  2. База знаний
  3. Контекст и State managers

Когда лучше использовать React Context?

Контекст и State managers

Context стоит использовать, когда данные нужны многим компонентам на разных уровнях дерева, а меняются они редко. Это транспорт «окружения», а не универсальный стейт-менеджер.

Хорошие случаи для Context

  • Тема оформления (light/dark) — нужна всем, меняется по клику раз в час.
  • Текущий пользователь и права — читают шапка, меню, гарды маршрутов.
  • Локаль и переводы, конфигурация, фиче-флаги.
  • Инстансы сервисов — api-клиент, сокет, аналитика (вместо синглтонов — удобно мокать в тестах).
  • Составные компоненты — <Tabs> делится состоянием с <Tab> через внутренний контекст.

Общий признак: данные глобальны для поддерева, обновления редкие, все потребители должны обновиться при изменении.

Когда Context — плохой выбор

  • Часто меняющееся состояние (ввод в поля, позиция мыши/скролла, таймеры): каждое изменение value перерендеривает всех потребителей, селекторов «на кусочек» нет.
  • Сложное взаимосвязанное состояние с множеством обновлений из разных мест — лучше Zustand/Redux с точечными подписками, devtools и middlware.
  • Данные с сервера — это кеш, а не контекст: TanStack Query/SWR.
  • Просто чтобы «не передавать проп на два уровня» — иногда достаточно композиции (children).

Практические правила

const value = useMemo(() => ({ user, logout }), [user, logout]);
<AuthContext.Provider value={value}>
  • Мемоизировать value (иначе каждый рендер провайдера будит потребителей).
  • Разделять контексты по частоте изменений (user отдельно от notifications).
  • Держать state рядом: провайдер владеет useState/useReducer и отдаёт наружу и данные, и действия.

Коротко для собеседования

Context — для редко меняющихся данных, нужных многим уровням: тема, пользователь, локаль, сервисы. Не подходит для частых обновлений и сложного стора — все потребители рендерятся целиком. Правила: мемоизированный value, раздельные контексты, серверные данные — в React Query, а не в контекст.

Другие вопросы раздела