ReactDOM.createPortal은 컴포넌트의 자식 요소들을 현재 DOM 계층 구조와 별도로, 지정한 다른 DOM 노드(예: document.body 또는 별도의 modal-root)에 렌더링할 수 있도록 해줍니다. 이를 통해 모달, 툴팁, 드롭다운 등 부모 요소의 스타일이나 레이아웃 영향 없이 UI를 구현할 수 있습니다.
overflow, z-index 등)과 독립적으로 렌더링되어 모달이 화면 전체에 올바르게 노출됨ReactDOM.createPortal(child, container)
child: 렌더링할 React 요소(컴포넌트, JSX 등)container: 해당 요소가 삽입될 실제 DOM 노드 (예: document.getElementById('modal-root'))document.body : 모달 요소가 애플리케이션의 최상위 DOM 요소인 body의 자식으로 추가하도록 하는 방법.
별도의 컨테이너를 만들 필요가 없어 사용이 더 간편하다. 다만 모달 로직이 복잡해지거나 여러 종류의 모달을 다루게 될 경우 관리가 어려워질 수 있다.
<body>
<div id="root"></div>
<div id="modal-root"></div>
</body>
아래는 간단한 Modal.jsx 구현 예제입니다.
// Modal.jsx
import React from 'react';
import ReactDOM from 'react-dom';
const Modal = ({ isOpen, onClose, children }) => {
// 모달이 렌더링될 DOM 컨테이너 (보통 index.html에 미리 정의된 div)
const modalRoot = document.getElementById('modal-root');
// 모달이 닫혀있으면 렌더링하지 않음
if (!isOpen) return null;
return ReactDOM.createPortal(
<div className="modal-overlay">
<div className="modal-content">
{/* 모달 닫기 버튼 */}
<button onClick={onClose}>닫기</button>
{children}
</div>
</div>,
modalRoot
);
};
export default Modal;
isOpen이 false면 모달이 렌더링되지 않음ReactDOM.createPortal을 통해 모달 콘텐츠가 modalRoot에 렌더링됨overlay, content 스타일은 별도의 CSS로 관리하여 부모 컴포넌트와 격리createPortal을 사용하면, Modal 컴포넌트는 부모 컴포넌트 트리 외부의 DOM에 삽입됩니다.z-index와 position 속성을 설정해야 합니다.ReactDOM.createPortal은 모달과 같이 부모 DOM 계층 외부에 렌더링해야 하는 UI 컴포넌트 구현에 유용합니다.ReactDOM.createPortal(child, container)이며, 이를 통해 모달 콘텐츠를 미리 정의된 DOM 노드(예: <div id="modal-root"></div>)에 삽입합니다.Modal.jsx 예제에서 조건부 렌더링, 닫기 기능, 그리고 자식 요소 전달 방식을 통해 모달의 기본 동작을 구현할 수 있습니다.