Portal

Renders a component outside the current DOM hierarchy.

Import#

import { Portal } from "@nature-ui/core";

Usage#

Portal is used to transport any component or element to the end of document.body and renders a React tree into it.

Useful for rendering a natural React element hierarchy with a different DOM hierarchy to prevent parent styles from clipping or hiding content (for popovers, dropdowns, and modals). It supports nested portals

function Example() {
return (
<Box className="bg-red-400 text-white">
I'm here,
<Portal>This text is portaled at the end of document.body!</Portal>
</Box>
);
}

Using a custom container#

You can render the contents within a portal to a different DOM node, instead of the default document.body. Pass the containerRef prop and set its value to the ref of the container you'd like to use.

function Example() {
const ref = React.useRef();
return (
<Box className="bg-red-400 text-white">
I'm here,
<Portal containerRef={ref}>
Portal: This text is portaled to the yellow box!
</Portal>
<Box ref={ref} className="bg-yellow-500">
<div>Container: Hey,</div>
</Box>
</Box>
);
}

Nesting Portals#

You can also nest multiple portals within themselves, this will create a nested DOM hierarchy to make it easy to create nested modals, popovers, etc.

function Example() {
const ref = React.useRef();
return (
<div>
<Portal containerRef={ref}>
<Box className="text-white bg-teal-500">
Parent: Hey welcome,
<Portal>Child: I'm attached to my parent portal</Portal>
</Box>
</Portal>
<Box className="text-white bg-red-500" ref={ref} />
</div>
);
}

Opting out of portal nesting#

In some cases, you might not want portal nodes to be nested to their parent portals. To opt out of this, pass appendToParentPortal and set it to false

function Example() {
const ref = React.useRef();
return (
<div>
<Portal containerRef={ref}>
<Box className="text-white bg-teal-500">
Parent: Hey welcome,
<Portal appendToParentPortal={false}>
Child: I'm going to document.body
</Portal>
</Box>
</Portal>
<div style={{ background: "red" }} ref={ref} />
</div>
);
}