Reactを使ったサイトでモーダルを出すならreact-modalが便利

環境

  • React v16.3.2
  • react-modal v3.5.1

インストールと使い方

インストールは以下で。

$ npm install react-modal

使い方

使いたいコンポーネント内でimportして、 <Modal></Modal> で挟んだものがモーダルになります。

また、 Modal.setAppElement() でAppを指定しておきます。(忘れがちなので注意)
これはモーダル自体が記述した箇所ではなく、下の方に生成されるため、どこのコンポーネント内に配置するのかにも使われる気がします。

import React from "react";
import Modal from "react-modal";

Modal.setAppElement("#app");

const customStyles = {
  overlay: {
    zIndex: "100",
    backgroundColor: "rgba(0, 0, 0, 0.5)"
  },
  content: {
    top: "50%",
    left: "50%",
    right: "auto",
    bottom: "auto",
    marginRight: "-50%",
    padding: "0",
    transform: "translate(-50%, -50%)"
  }
};

class Modal extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      modalIsOpen: false
    };

    this.openModal = this.openModal.bind(this);
    this.afterOpenModal = this.afterOpenModal.bind(this);
    this.closeModal = this.closeModal.bind(this);
  }

  openModal() {
    this.setState({modalIsOpen: true});
  }
 
  afterOpenModal() {
    
  }
 
  closeModal() {
    this.setState({modalIsOpen: false});
  }

  render() {
    return (
      <Modal
        isOpen={this.state.modalIsOpen}
        onRequestClose={this.closeModal}
        onAfterOpen={this.afterOpenModal}
        style={customStyles}
      >
       // コンテンツ部分
      </Modal>
    );
  }
}

state内でもっている modalIsOpen の値が Modal に渡っていて、表示/非表示を切り替えます。
また、 onAfterOpen はモーダルを表示した際に走る処理なので、開いた瞬間に中身をリセットするときとかに便利です。
onRequestClose は背景のオーバーレイ部分をクリックした時に発火するようなので、 this.close を含んだ処理を渡しておくといいかも。

これをベースに HogeModal コンポーネントを作っていくとかなり楽でした。

表示時にアニメーションをしたい場合

react-modal で生成されたコンテンツには、 ReactModal__Content というclassが付与されるのですが、コンテンツ部分の表示後に ReactModal__Content--after-open というclassが付与されるのでこれを上手く使うと実装できます。

たとえば最初は少し上にずらしておいて、 ReactModal__Content--after-open の方にずらし多分をリセットするスタイルを書いておけば、上からおりてくるアニメーションなんかも実装できます。