How toUse React Portal in Remix

Because React Portals needs an actual DOM element where to be attached, we can't just use them in a Remix app because when doing Server-Side Rendering it will fail since there's no DOM.

We can solve this by using Remix Utils' ClientOnly.

app/routes/something.tsx
import { ClientOnly } from "remix-utils/client-only"; export default function Component() { return ( <ClientOnly> {() => createPortal(<Modal />, document.getElementById('modal-portal')} </ClientOnly> ) }

With this we'll delay the rendering to the Modal inside a Portal until hydration happens client-side.