PassFront
  1. PassFront
  2. База знаний
  3. Состояние

Как React синхронизирует состояние DOM?

Состояние

React синхронизирует DOM с состоянием по принципу «UI = f(state)»: любое изменение данных запускает цикл «рендер → дифф → точечный коммит», приводящий DOM в соответствие новому состоянию.

Цикл синхронизации

setState → render (новое описание UI) → reconciliation (что отличается?)
        → commit (правки DOM) → DOM соответствует состоянию
  • Разработчик не синхронизирует DOM вручную — описывает желаемый вид для текущего состояния.
  • React вычисляет разницу между «как должно быть» и «как было» и вносит только её.
  • Обновления батчатся: несколько setState — один цикл; DOM не проходит через промежуточные состояния.

Направление синхронизации — одностороннее

React считает источником правды своё дерево, а не DOM: он не читает DOM, чтобы «узнать изменения», а перезаписывает управляемые им атрибуты при каждом обновлении. Отсюда:

  • ручные мутации React-управляемых узлов (jQuery, innerHTML) будут перезатёрты или сломают дифф;
  • для полей форм есть выбор: управляемые (value из state — DOM подчинён состоянию) или неуправляемые (DOM хранит значение сам, React читает по требованию через ref).

Что сохраняется при синхронизации

Благодаря переиспользованию узлов (тот же тип/key — тот же DOM-элемент) браузерное состояние узлов — фокус, позиция курсора, скролл, воспроизведение видео — переживает обновления: React меняет атрибуты, а не пересоздаёт элементы.

Обратная связь из DOM

Когда данные рождаются в DOM (события ввода, размеры), React получает их через события (onChange) и refs/эффекты — и заносит в state, замыкая цикл.

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

Синхронизация одностороння: состояние — источник правды; на каждое изменение React рендерит новое описание UI, диффом находит отличия и точечно правит DOM (батчируя обновления и переиспользуя узлы — фокус/скролл сохраняются). Данные из DOM возвращаются в state через события и refs, ручные мутации React-узлов запрещены.

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