Skip to content
React

Portal

渲染到组件外的 DOM 节点。

#react#portal

Code

react
import { createPortal } from 'react-dom';
import { useState, useEffect } from 'react';

// Modal
function Modal({ isOpen, onClose, children }) {
    if (!isOpen) return null;

    return createPortal(
        <div className="modal-overlay" onClick={onClose}>
            <div className="modal-content" onClick={e => e.stopPropagation()}>
                <button className="modal-close" onClick={onClose}>&times;</button>
                {children}
            </div>
        </div>,
        document.body
    );
}

// Usage
function App() {
    const [show, setShow] = useState(false);

    return (
        <div style={{ overflow: 'hidden', position: 'relative' }}>
            <button onClick={() => setShow(true)}>Open Modal</button>
            <Modal isOpen={show} onClose={() => setShow(false)}>
                <h2>Modal Title</h2>
                <p>Modal content here</p>
            </Modal>
        </div>
    );
}

// Tooltip
function Tooltip({ target, content }) {
    return createPortal(
        <div className="tooltip" style={{
            position: 'fixed',
            top: target.rect.top - 30,
            left: target.rect.left,
        }}>
            {content}
        </div>,
        document.body
    );
}

// Confirm Portal position in DOM
// <div id="root">
//   <App />  <-- Modal component here
// </div>
// <body>
//   <div>Modal overlay</div>  <-- Portal renders here
// </body>