Building a Modal Component with Portals
Create a reusable modal that renders into document.body via createPortal.
Building a Modal Component with Portals is a free React Academy lesson on CoddyKit — lesson 2 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the React Academy learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
Welcome
Modal Component Skeleton
function Modal({ isOpen, onClose, children }) {
if (!isOpen) return null;
return createPortal(
<div className="backdrop" onClick={onClose}>
<div className="modal" onClick={e => e.stopPropagation()}>
{children}
</div>
</div>,
document.body
);
}Backdrop & Stop Propagation
Closing with the Escape Key
useEffect(() => {
if (!isOpen) return;
const handle = (e) => { if (e.key === 'Escape') onClose(); };
document.addEventListener('keydown', handle);
return () => document.removeEventListener('keydown', handle);
}, [isOpen, onClose]);Preventing Body Scroll
useEffect(() => {
if (isOpen) {
document.body.style.overflow = 'hidden';
}
return () => { document.body.style.overflow = ''; };
}, [isOpen]);Basic CSS for the Modal
.backdrop {
position: fixed; inset: 0;
background: rgba(0,0,0,0.5);
display: flex; align-items: center; justify-content: center;
z-index: 1000;
}
.modal {
background: white;
border-radius: 8px;
padding: 24px;
min-width: 320px;
}Using the Modal
function App() {
const [open, setOpen] = useState(false);
return (
<>
<button onClick={() => setOpen(true)}>Open Modal</button>
<Modal isOpen={open} onClose={() => setOpen(false)}>
<h2>Hello from the modal!</h2>
<button onClick={() => setOpen(false)}>Close</button>
</Modal>
</>
);
}Adding a Close Button Inside
Animation with CSS Transitions
// Toggle class based on isOpen
<div className={`backdrop ${isOpen ? 'visible' : 'hidden'}`}>Composing a Modal Header & Footer
Quick Check
Recap
Up Next
Frequently asked questions
Is the “Building a Modal Component with Portals” lesson free?
Yes — the full text of “Building a Modal Component with Portals” is free to read here on the web, and the React Academy course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the React Academy course, upgrade to CoddyKit PRO.
What will I learn in “Building a Modal Component with Portals”?
Create a reusable modal that renders into document.body via createPortal. You practise React Academy with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start React Academy?
No prior experience is required. React Academy on CoddyKit is structured for beginners through advanced learners; this is — lesson 2 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “Building a Modal Component with Portals” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this React Academy lesson?
Yes. Every React Academy lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- What Are React Portals?
- Building a Modal Component with Portals
- Handling Focus & Keyboard Traps in Modals
- Tooltips & Dropdown Menus with Portals