В чем разница между изменением Context и State в React?
Контекст и State managers
И контекст, и state обновляются в итоге через setState — разница в радиусе поражения: state перерисовывает свой компонент и его поддерево, изменение контекста — всех потребителей этого контекста, где бы они ни были.
Изменение state
const [count, setCount] = useState(0);- Ререндерится компонент-владелец + каскадом его дети.
- Локально и предсказуемо: зона обновления видна по дереву.
- Пропуск обновления: то же значение (Object.is) → рендера нет; React.memo останавливает каскад.
Изменение Context
<UserContext.Provider value={user}> ... </UserContext.Provider>- Само value обычно тоже живёт в state провайдера, но при его изменении React дополнительно находит все компоненты с useContext(UserContext) в поддереве и помечает их на ререндер.
- Потребители обновляются сквозь React.memo и через любые уровни — мемоизация промежуточных компонентов не защищает.
- Селекторов нет: изменилось одно поле value-объекта — перерисовались все, даже кому это поле не нужно.
Практические следствия
- Часто меняющиеся данные в контексте — удар по производительности: каждый тик будит всех потребителей. Такое состояние держат в локальном state, спускают вниз или выносят в стор с селекторами.
- value-объект мемоизируют (
useMemo), иначе каждый рендер провайдера = «изменение контекста» для всех. - Контекст хорош для редких обновлений (тема, пользователь), state — для всего локального.
Коротко для собеседования
State обновляет владельца и его поддерево (каскад можно прервать React.memo); Context — всех потребителей useContext, минуя memo, без селекторов, целым value. Поэтому контекст — для редко меняющегося «окружения» с мемоизированным value, а динамичные данные — в локальном state или сторе.