Как 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.