Performance: Modal pattern with intercepting routes
This pattern affects page load speed and interaction responsiveness by controlling when modals load and how routes update without full page reloads.
import { useRouter } from 'next/navigation'; function Page() { const router = useRouter(); const openModal = () => { router.push('/page/modal'); // Intercepting route opens modal overlay }; return <button onClick={openModal}>Open Modal</button>; } // Modal is a separate route segment rendered as overlay without full reload
import { useRouter, useSearchParams } from 'next/navigation'; function Page() { const router = useRouter(); const searchParams = useSearchParams(); const modalOpen = searchParams.get('modal') === 'true'; return ( <> <button onClick={() => router.push('/page?modal=true')}>Open Modal</button> {modalOpen && <Modal />} </> ); } function Modal() { return <div>Modal Content</div>; } // Navigation triggers client navigation/re-render to show modal content // e.g., /page?modal=true causes navigation and re-render
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Full page reload modal | High (reloads entire DOM) | Multiple reflows | High paint cost | [X] Bad |
| Intercepting route modal overlay | Low (adds overlay nodes) | Single reflow | Low paint cost | [OK] Good |
?modal=open:
const router = useRouter();
const isModalOpen = router.query.modal === 'open';
return (
<>
{isModalOpen && <ModalComponent />}
<MainPageContent />
</>
);
What happens when the URL changes from /page to /page?modal=open?isModalOpen true, so modal appears over the main page without replacing it.const router = useRouter();
const isModalOpen = router.query.modal === 'open';
function closeModal() {
router.push('/page');
}
return (
<>
{isModalOpen && <Modal onClose={closeModal} />}
<PageContent />
</>
);
What is a likely bug in this code regarding accessibility?/gallery?modal=photo123 and closes by removing the query param, without losing the gallery scroll position. Which approach best achieves this?router.push with shallow: true changes query params to open/close modal without losing scroll position.Pass the test and this pattern moves unknown