Home

Awesome

React-portal

npm version npm downloads Build Status

Struggling with modals, lightboxes or loading bars in React? React-portal creates a new top-level React tree and injects its children into it. That's necessary for proper styling (especially positioning).

Looking for v3 documentation? Go here.

Features

Installation

yarn add react react-dom react-portal

Usage

Portal

import { Portal } from 'react-portal';

<Portal>
  This text is portaled at the end of document.body!
</Portal>

<Portal node={document && document.getElementById('san-francisco')}>
  This text is portaled into San Francisco!
</Portal>

That's it! Do you want to toggle portal? It's a plain React component, so you can simply do:

{isOpen && <Portal>Sometimes portaled?</Portal>}

This gives you absolute flexibility and control and I would recommend you to use it as a basic building block for your components like modals or notifications. This code also works with server-side rendering. If you think about just using official ReactDOM.createPortal(), you would have to check for existence of DOM environment.

React-portal used to come packed with some extra goodies because sometimes you are ok with giving up some flexibility for convenience. For that case, V4 introduces another component that handles its own state for you:

PortalWithState

import { PortalWithState } from 'react-portal';

<PortalWithState closeOnOutsideClick closeOnEsc>
  {({ openPortal, closePortal, isOpen, portal }) => (
    <React.Fragment>
      <button onClick={openPortal}>
        Open Portal
      </button>
      {portal(
        <p>
          This is more advanced Portal. It handles its own state.{' '}
          <button onClick={closePortal}>Close me!</button>, hit ESC or
          click outside of me.
        </p>
      )}
    </React.Fragment>
  )}
</PortalWithState>

Don't let this example intimidate you! PortalWithState expects one child, a function. This function gets a few parameters (mostly functions) and returns a React component.

There are 4 optional parameters:

<PortalWithState /> accepts this optional props:

Also notice, that the example returns a Fragment since React 16.2 supports it! You can also return:

If you start running into limits of <PortalWithState /> (complex animations), you probably want to use <Portal /> instead and build a component tailored to your specific taste.

Run Examples

git clone https://github.com/tajo/react-portal
cd react-portal
yarn install
yarn build:examples
open examples/index.html

Contributions Welcome!

git clone https://github.com/tajo/react-portal
cd react-portal
yarn install
yarn build:examples --watch
open examples/index.html

Run Tests

yarn test

Author

Vojtech Miksu 2017, miksu.cz, @vmiksu