Portal
Renders a component outside the current DOM hierarchy.
Import
import { Portal } from '@hover/blueprint'
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 bg='red.400' color='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 bg='red.400' color='white'> I'm here, <Portal containerRef={ref}> Portal: This text is portaled to the yellow box! </Portal> <Box ref={ref} 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 bg='teal.500' color='white'> Parent: Hey welcome, <Portal>Child: I'm attached to my parent portal</Portal> </Box> </Portal> <Box bg='red.400' color='white' 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 bg='teal.500' color='white'> Parent: Hey welcome, <Portal appendToParentPortal={false}> Child: I'm going to document.body </Portal> </Box> </Portal> <div style={{ background: 'red' }} ref={ref} /> </div> )}