https://react.dev/reference/react-dom/createPortal
What is that
We can specify DOM element for rendering
When we could use it
For example, If we want to write <Modal />
component in some component, but want to rendering other parent component (ex. document.body)
We could write Modal, Popover component easily ignoring parent CSS effect like overflow: hidden
.
And no matter what it is, easy to read code.
Example
this is example that modal opens center of window by using createPortal
import React, { useState } from 'react'; import ReactDOM from 'react-dom'; function Modal({ isOpen, onClose, children }) { if (!isOpen) return null; return ReactDOM.createPortal( <div style={styles.overlay}> <div style={styles.modal}> {children} <button onClick={onClose} style={styles.closeButton}>Close</button> </div> </div>, document.body // ⭐️ the rendering destination of Portal ); } export default function App() { const [isModalOpen, setIsModalOpen] = useState(false); return ( <div> <button onClick={() => setIsModalOpen(true)}>Open Modal</button> <Modal isOpen={isModalOpen} onClose={() => setIsModalOpen(false)}> <h1>Hello, Modal!</h1> </Modal> </div> ); } const styles = { overlay: { ⭐️ position: 'fixed', ⭐️ top: 0, ⭐️ left: 0, ⭐️ width: '100vw', ⭐️ height: '100vh', backgroundColor: 'rgba(0, 0, 0, 0.5)', display: 'flex', justifyContent: 'center', alignItems: 'center', zIndex: 1000, }, modal: { ... }, closeButton: { ... }, };
Top comments (0)