Портал (Portal
) - это механизм в React, который позволяет рендерить компоненты внутри других элементов, которые находятся вне иерархии DOM-дерева компонента-родителя. Это означает, что порталы позволяют размещать компоненты в произвольных местах страницы, включая области, которые обычно находятся за пределами корневого элемента React-приложения.
Порталы особенно полезны в случаях, когда нам нужно отобразить компоненты поверх других элементов, например, при создании модальных окон, всплывающих подсказок, или приложений, которые должны отображаться внутри веб-страниц другого сайта.
В React, порталы создаются с помощью компонента ReactDOM.createPortal(child, container)
, где child
- это дочерний компонент, который необходимо отобразить, а container
- это DOM-элемент, в который нужно поместить этот компонент.
Например, для создания портала, который будет отображать компонент Modal
в элементе modal-root
, который находится вне корневого элемента React-приложения, можно использовать следующий код:
import React from "react"
import ReactDOM from "react-dom"
function Modal(props) {
return ReactDOM.createPortal(props.children, document.getElementById("modal-root"))
}
export default Modal
В этом примере компонент Modal
создает портал, который отображает его дочерние компоненты в элементе с идентификатором modal-root
. Этот элемент может быть создан где угодно на странице, и компонент Modal
будет отображаться внутри него, независимо от того, где находится корневой элемент React-приложения.
**Portal
и z-index
Portals
предоставляют способ решения проблемы с z-index
для элементов, которые должны быть размещены вне иерархии компонентов.
Когда элементы рендерятся внутри компонента в React, они обычно наследуют свойства стилей и z-index
от своих родительских компонентов. Это может вызвать проблемы, когда вам нужно разместить элемент поверх других элементов на странице.
С помощью порталов вы можете рендерить компонент в DOM-узле, который находится вне иерархии компонентов. Это позволяет вам контролировать положение элемента независимо от иерархии компонентов и перекрывать другие элементы с помощью стилей.
Вот пример использования порталов в React:
import React from "react"
import ReactDOM from "react-dom"
const Modal = ({ children }) => {
return ReactDOM.createPortal(
<div className="modal">{children}</div>,
document.getElementById("modal-root"), // DOM-узел, в который будет рендериться портал
)
}
const App = () => {
return (
<div>
<h1>My App</h1>
<Modal>
<p>This is a modal</p>
</Modal>
</div>
)
}
ReactDOM.render(<App />, document.getElementById("root"))
В приведенном примере мы создаем компонент Modal
, который рендерит дочерние элементы в портале с помощью createPortal()
. Мы указываем document.getElementById('modal-root')
вторым аргументом createPortal()
, чтобы портал был рендерен внутри элемента с id “modal-root”, который мы предварительно создали в DOM.