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

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

準備

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

src を右クリックして New Folder

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

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

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

https://react-bootstrap.github.io/components/overlays/#popovers

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

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

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

import React from 'react';
import { Popover as BootstrapPopover } from 'react-bootstrap';

const Popover = React.forwardRef((props, ref) => {
  const {
    title,
    children,
    ...otherProps
  } = props;

  return (
    <BootstrapPopover {...otherProps} ref={ref}>
      {
        title && (
          <BootstrapPopover.Header as="h3">
            {title}
          </BootstrapPopover.Header>
        )
      }
      <BootstrapPopover.Body>
        {children}
      </BootstrapPopover.Body>
    </BootstrapPopover>
  )
});

export default Popover;

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

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

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

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

import React from 'react';
import './App.css';

import OverlayTrigger from './components/OverlayTrigger';
import Popover from './components/Popover';

function App() {
  return (
    <>
      <div className="p-5 bg-dark">
        <div className="p-5 d-flex flex-column justify-content-center align-items-center">
          <OverlayTrigger
            placement="right"
            trigger={["hover"]}
            delay={{ show: 250, hide: 400 }}
            overlay={
              <Popover title="Popover Sample">
                Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
              </Popover>
            }
          >
            <div className="p-5 bg-light d-flex justify-content-center align-items-center rounded">
              <h1>BASE</h1>
            </div>
          </OverlayTrigger>
        </div>
      </div>
    </>
  );
}

export default App;

画面を確認してみます。

はい、できました。