PassFront
  1. PassFront
  2. База знаний
  3. Основы React

Как React узнает об изменениях?

Основы React

React не наблюдает за данными — он узнаёт об изменениях, только когда код явно вызывает его API. Никакой магии слежения за объектами (как в Vue) в React нет.

Каналы, через которые React узнаёт

  • Сеттер useState / dispatch useReducer — главный канал: вызов планирует обновление компонента.
  • this.setState в классах.
  • Изменение value у Context.Provider — пометить всех потребителей (само value меняется через state выше).
  • useSyncExternalStore — внешний стор дёргает колбэк подписки, React перечитывает снапшот.
  • Рендер родителя автоматически рендерит детей — без отдельного сигнала.

Что из этого следует

const [user, setUser] = useState({ name: 'Аня' });

user.name = 'Боря';        // React НЕ узнает: это обычная мутация объекта
setUser(user);             // и так НЕ узнает: ссылка та же (Object.is)
setUser({ ...user, name: 'Боря' }); // узнает: вызван сеттер с новой ссылкой

Отсюда требование иммутабельности: новая ссылка — это и есть «сообщение» об изменении.

Что происходит после сигнала

  • Сеттер сравнивает значение с текущим (Object.is); совпало — обновление пропускается.
  • Компонент помечается «грязным», обновление планируется (с React 18 — с батчингом и приоритетами).
  • Render-фаза: компонент и его поддерево вызываются, строится новое виртуальное дерево.
  • Reconciliation: сравнение со старым деревом.
  • Commit: в реальный DOM вносятся только фактические отличия.

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

React узнаёт об изменениях только через явные вызовы: сеттеры state/dispatch, изменение value контекста, подписки useSyncExternalStore. Мутации объектов он не видит — нужен вызов сеттера с новой ссылкой. Дальше: пометка компонента, рендер поддерева, дифф и точечный коммит в DOM.

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