hydrate¶
Устарело
Этот API будет удален в одной из будущих основных версий React.
В React 18 hydrate
был заменен на hydrateRoot
. Использование hydrate
в React 18 предупредит, что ваше приложение будет вести себя так, как будто оно работает под управлением React 17.
hydrate
позволяет отображать компоненты React внутри узла DOM браузера, HTML-содержимое которого было предварительно сгенерировано react-dom/server
в React 17 и ниже.
1 |
|
Описание¶
hydrate(reactNode, domNode, callback?)
¶
Вызывает hydrate
в React 17 и ниже для "прикрепления" React к существующему HTML, который уже был отрисован React в серверной среде.
1 2 3 |
|
React присоединится к HTML, существующему внутри domNode
, и возьмет на себя управление DOM внутри него. Приложение, полностью построенное на React, обычно имеет только один вызов hydrate
со своим корневым компонентом.
Параметры
reactNode
: "Узел React", используемый для рендеринга существующего HTML. Обычно это кусок JSX типа<App />
, который был отрисован с помощью методаReactDOM Server
, такого какrenderToString(<App />)
в React 17.domNode
: DOM-элемент, который был отображен как корневой элемент на сервере.- опционально:
callback
: Функция. Если она передана, React вызовет ее после того, как ваш компонент будет гидратирован.
Возвращает
hydrate
возвращает null
.
Ограничения
hydrate
ожидает, что отрисованное содержимое будет идентично содержимому, отрисованному на сервере. React может исправлять различия в текстовом содержимом, но вы должны рассматривать несоответствия как ошибки и исправлять их.- В режиме разработки React предупреждает о несоответствиях во время гидратации. Нет никаких гарантий, что различия между атрибутами будут исправлены в случае несовпадений. Это важно по соображениям производительности, поскольку в большинстве приложений несоответствия встречаются редко, и поэтому валидация всей разметки была бы непомерно дорогой.
- Скорее всего, в вашем приложении будет только один вызов
hydrate
. Если вы используете фреймворк, он может сделать этот вызов за вас. - Если ваше приложение клиентское, без уже отрендеренного HTML, использование
hydrate()
не поддерживается. Вместо этого используйтеrender()
(для React 17 и ниже) илиcreateRoot()
(для React v18).
Использование¶
Вызовите hydrate
для вложения React компонента в отрендеренный сервером browser DOM node.
1 2 3 |
|
Использование hydrate()
для рендеринга приложения только для клиента (приложение без серверного рендеринга HTML) не поддерживается. Вместо этого используйте render()
(в React 17 и ниже) или createRoot()
(в React 18+).
Гидратация серверного рендеринга HTML¶
В React "гидратация" - это то, как React "присоединяется" к существующему HTML, который уже был отрисован React в серверной среде. Во время гидратации React попытается прикрепить слушателей событий к существующей разметке и взять на себя рендеринг приложения на клиенте.
В приложениях, полностью построенных на React, вы обычно будете гидратировать только один "корень", один раз при запуске для всего приложения.
1 2 3 4 5 |
|
1 2 3 4 5 |
|
1 2 3 |
|
Обычно вам не нужно вызывать hydrate
снова или вызывать его в других местах. С этого момента React будет управлять DOM вашего приложения. Для обновления пользовательского интерфейса ваши компоненты будут использовать состояние.
Для получения дополнительной информации о гидратации смотрите документацию для hydrateRoot
.
Подавление неизбежных ошибок несоответствия гидратации¶
Если атрибут или текстовое содержимое одного элемента неизбежно отличается на сервере и клиенте (например, метка времени), вы можете заглушить предупреждение о несоответствии гидратации.
Чтобы заглушить предупреждения о несоответствии гидратации для элемента, добавьте suppressHydrationWarning={true}
:
1 2 3 4 5 |
|
1 2 3 4 5 |
|
1 2 3 4 5 6 7 |
|
Он действует только на глубине одного уровня и предназначен для эвакуации. Не злоупотребляйте им. Если это не текстовое содержимое, React не будет пытаться исправить его, поэтому оно может оставаться непоследовательным до будущих обновлений.
Обработка различного содержимого клиента и сервера¶
Если вам намеренно нужно отобразить что-то разное на сервере и клиенте, вы можете сделать двухпроходной рендеринг. Компоненты, которые отображают что-то разное на клиенте, могут считывать переменную состояния, например isClient
, которую вы можете установить в значение true
в эффекте:
1 2 3 4 5 |
|
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 9 10 11 |
|
Таким образом, начальный проход рендеринга будет рендерить тот же контент, что и сервер, избегая несоответствий, но дополнительный проход будет происходить синхронно сразу после гидратации.
Такой подход делает процесс гидратации медленнее, поскольку ваши компоненты должны отображаться дважды. Помните о пользовательском опыте на медленных соединениях. Код JavaScript может загружаться значительно позже, чем первоначальный HTML-рендеринг, поэтому отображение другого пользовательского интерфейса сразу после гидратации может показаться пользователю резким.
Источник — https://react.dev/reference/react-dom/hydrate