How to create a reusable overlay in React Js

Last updated : Jul 30, 2023 12:00 AM

This tutorial will show you how to create a reusable overlay in React Js. To make the overlay reusable and global in my application, I use a React portal to host my overlay. React portals live outside the components to make them more common to all the components in the application.

1. Create a placeholder to mount the overlay

Edit the index.html file in the public folder and add a div. My div id is modal.

<body>
    <div id="overlay"></div><!-- to mount the overlay -->
    <div id="root"></div><!-- to mount the app -->
</body>

2. Create a React component to render the overlay

Now I need a component to render the overlay. In this way, I can reuse my overlay for different purposes. Such as to show a modal or a loading indicator. I can hide the modal using the function passed in as a prop.

import { ReactNode } from "react"
import ReactDOM from 'react-dom';
import styles from "./Overlay.module.css"

interface OverlayProps {
    children: ReactNode
    hideOverlay: () => void
}
export const Overlay = (props: OverlayProps) => {
 return ReactDOM.createPortal(
    <div className={styles.overlay} onClick={props.hideOverlay}>{props.children}</div>, 
    document.getElementById("overlay")!)
}

My overlay styles are in a CSS module called Overlay.module.css.

.overlay {
  position: fixed;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background-color: rgba(0,0,0,0.5);
  z-index: 2;
  cursor: pointer;
}

It is simple as that. Now I have a reusable overlay that I can use in any component. Use the overlay component and pass any data you want to display.

import { useState } from "react"
import { Overlay } from "./components/overlay"

export const App = () => {

const [show, setShow] = useState<boolean>(false)

const showOverlay = () => {
   setShow(true)
}

const hideOverlay = () => {
   setShow(false)
}

   return(
      <>
         {show && 
            <Overlay hideOverlay={hideOverlay}>
               {/*Pass any data to the modal */}
            </Overlay>
         }
         <button onClick={showOverlay}>Show Modal</button>
      </>
   )
}
export default App
Lance

By: Lance

Hi, I'm Lance Raney, a dedicated Fullstack Developer based in Oklahoma with over 15 years of exp

Read more...