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

В чем разница между изменением 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 или сторе.

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