[React Bootstrap] Modal を表示してみる | 心を無にして始める React

今回は、Modal コンポーネントを表示します。

準備

まだ components フォルダがなければ作ります。

src を右クリックして New Folder

components と入力してフォルダを作ります。

今回は、components フォルダに Modal のコンポーネントを作って、表示してみます。

公式のドキュメントはここ。

https://react-bootstrap.github.io/components/modal/

Modal コンポーネントをつくる

component フォルダに Modal.js を作ります。

Modal.js を心を無にして編集してみます。

import React from 'react';
import { Modal as BootstrapModal } from 'react-bootstrap';

function Modal(props) {
  const {
    show,
    title,
    header,
    body,
    footer,
    onHide,
    ...otherProps
  } = props;

  return show && (
    <BootstrapModal show={show} onHide={onHide} {...otherProps}>
      {
        (title || header) && (
          <BootstrapModal.Header closeButton>
            {header}
            {
              title && (
                <BootstrapModal.Title>
                  {title}
                </BootstrapModal.Title>
              )
            }
          </BootstrapModal.Header>
        )
      }
      {
        body && (
          <BootstrapModal.Body>
            {body}
          </BootstrapModal.Body>
        )
      }
      {
        footer && (
          <BootstrapModal.Footer>
            {footer}
          </BootstrapModal.Footer>
        )
      }
    </BootstrapModal>
  )
}

export default Modal;

プロジェクトでは、コンポーネントを統一したデザインで利用することが多いです。

そのため、(React Bootstrap のコンポーネントをその場その場でカスタマイズしながら使うよりも、)プロジェクトでコンポーネントにしたものを使うほうが、変更をお手軽に漏れなくできることが多いです。

Modal コンポーネントを表示する

それでは、 App.js を編集して Modal コンポーネントを表示します。

import React, { useState } from 'react';
import './App.css';
import Button from './components/Button';
import Modal from './components/Modal';

function App() {
  const [show, setShow] = useState(false);

  const handleShow = (cb) => {
    setShow(true);
    if (cb) {
      cb();
    }
  }

  const handleHide = (cb) => {
    setShow(false);
    if (cb) {
      cb();
    }
  }

  return (
    <div className="m-5">
      <Button onClick={handleShow}>表示する</Button>
      <Modal
        show={show}
        title="猫の手も借りたい"
        body={
          <p>
            非常に忙しく手不足で、どんな手伝いでもほしいことのたとえ。<br />
            猫の手のほうがずっとうれしいです、ありがとうございます!
          </p>
        }
        footer={
          <Button variant="secondary" onClick={handleHide}>閉じる</Button>
        }
        onHide={handleHide}
      />
    </div >
  );
}

export default App;

画面を確認してみます。

はい、できました。