Когда вы инициализируете приложение React, ReactDOM
запрашивает один контейнер DOM
, для которого все ваши компоненты React будут отображаться в соответствии с этим DOM
.Это делает React для всего процесса рендеринга.
Однако иногда вам необходимо контролировать некоторые компоненты React для рендеринга с использованием другого элемента DOM
и взаимодействия с существующим приложением React.В этой ситуации удобно использовать порталы React.
Поскольку React создает виртуальные элементы в подполье, вы не можете преобразовать их в DOM
элементы и вставить их непосредственно в DOM
.React Portals позволяет вам передавать React Elements и указывать DOM контейнера для них.
Вот пример для демонстрации
У вас есть Modal
компонент, который отображает div
элемент в центре.
function Modal() {
return (
<div style={{ position: 'absolute', left: '50%'}}>
Message
</div>
);
}
Один компонент Modal
помещается внутрь div
, который имеет некоторую относительную позицию.
<div style={{ position: 'relative', left: 100 }}>
<Modal />
</div>
Проблема заключается в том, что компонент Modal
отображаетсяего положение относительно положения родительского div
, но вам нужно показать его в центре окна.
Чтобы решить эту проблему, вы можете добавить свой компонент Modal
непосредственно body
элемент.Это можно легко сделать с помощью порталов.
Вот решение для порталов.
function ModalRenderer() {
return (
React.createPortal(
<Modal />,
document.body
)
);
}
И использование компонента ModalRenderer
в любом месте вашего приложения.
<div style={{ position: 'relative', left: 100 }}>
<ModalRenderer />
</div>
Таким образом, ваш ModalRenderer
решитэлемент контейнера для Modal
, который не зависит от дерева вашего приложения.