しかし、ゼロから CSS や JavaScript を書いてモーダルを作るのは大変ですよね。
そこで、今回は react-modal
というライブラリを使って簡単にモーダルを実装する方法を丁寧に解説します。
- 現役のフルスタックエンジニアとして活躍中
- 開発チームリーダーとして複数プロジェクトをリード
- 副業プログラミングスクール講師として数百名以上を指導してきた教育のプロ
- プログラミングスクールのカリキュラム執筆経験あり
react-modal とは何か?
react-modal とは、JavaScriptのライブラリであるReactを用いて、ウェブページにモーダルウィンドウを追加するためのツールです。
https://github.com/reactjs/react-modal
モーダルウィンドウとは、ウェブサイトのメインのコンテンツの上に新たに表示される小さいウィンドウのことで、よくお知らせや入力フォームなどに用いられます。
react-modal の基本的な使い方
まず、react-modal をプロジェクトにインストールします。
npm install react-modal
インストールが完了したら、React Modalを使用したコンポーネントを作成しましょう。
import React from 'react';
import Modal from 'react-modal';
class ExampleApp extends React.Component {
constructor() {
super();
this.state = {
showModal: false
};
this.handleOpenModal = this.handleOpenModal.bind(this);
this.handleCloseModal = this.handleCloseModal.bind(this);
}
handleOpenModal () {
this.setState({ showModal: true });
}
handleCloseModal () {
this.setState({ showModal: false });
}
render () {
return (
<div>
<button onClick={this.handleOpenModal}>モーダルを開く</button>
<Modal
isOpen={this.state.showModal}
contentLabel="Example Modal"
>
<h2>ハロー、ワールド!</h2>
<button onClick={this.handleCloseModal}>閉じる</button>
</Modal>
</div>
);
}
}
export default ExampleApp;
これは、モーダルウィンドウを開くボタンをクリックすると「ハロー、ワールド!」と表示される簡単な例です。
isOpen
プロパティにステートのshowModal
を渡してモーダルの開閉を制御- 「モーダルを開く」ボタンクリックで
handleOpenModal
を呼び出し - ステートの
showModal
がtrue
になりモーダルが表示 - 「閉じる」ボタンクリックで
handleCloseModal
を呼び出し - ステートの
showModal
がfalse
になりモーダルが閉じる
このように、React Modalを用いて簡単にモーダルウィンドウを作成・制御することができます。
react-modal のコンポーネント化とは?
Reactの魅力の一つは、UIを再利用可能な部品(コンポーネント)に分割できる点です。
では、具体的にどのようにコンポーネント化を行う例を見てみましょう。
import React from 'react';
import Modal from 'react-modal';
class ModalComponent extends React.Component {
constructor(props) {
super(props);
this.handleCloseModal = this.handleCloseModal.bind(this);
}
handleCloseModal () {
this.props.onClose();
}
render () {
return (
<Modal
isOpen={this.props.isOpen}
contentLabel="Example Modal"
>
<h2>{this.props.title}</h2>
<p>{this.props.content}</p>
<button onClick={this.handleCloseModal}>閉じる</button>
</Modal>
);
}
}
export default ModalComponent;
以上のModalComponent
は、モーダルウィンドウ自体を一つのコンポーネントとして扱っています。
このコンポーネントは、isOpen
、title
、content
、onClose
というプロップスを受け取ります。
例えば、以下のように使用することができます。
import React from 'react';
import ModalComponent from './ModalComponent';
class ExampleApp extends React.Component {
constructor() {
super();
this.state = {
showModal: false
};
this.handleOpenModal = this.handleOpenModal.bind(this);
this.handleCloseModal = this.handleCloseModal.bind(this);
}
handleOpenModal () {
this.setState({ showModal: true });
}
handleCloseModal () {
this.setState({ showModal: false });
}
render () {
return (
<div>
<button onClick={this.handleOpenModal}>モーダルを開く</button>
<ModalComponent
isOpen={this.state.showModal}
title="ハロー、ワールド!"
content="これはモーダルウィンドウのテストです。"
onClose={this.handleCloseModal}
/>
</div>
);
}
}
export default ExampleApp;
上記のコードでは、ModalComponent
を再利用して、開閉や表示内容を自由に制御しています。
react-modal で複数のモーダルを制御する方法
Webサイトでモーダルウィンドウを扱うとなると、例えば会員登録を促すモーダルやログインを促すモーダルなど、複数のモーダルウィンドウを扱う必要があります。
では、具体的にどのように制御するのか見てみましょう。
import React from 'react';
import ModalComponent from './ModalComponent';
class ExampleApp extends React.Component {
constructor() {
super();
this.state = {
showModal1: false,
showModal2: false
};
this.handleOpenModal1 = this.handleOpenModal1.bind(this);
this.handleCloseModal1 = this.handleCloseModal1.bind(this);
this.handleOpenModal2 = this.handleOpenModal2.bind(this);
this.handleCloseModal2 = this.handleCloseModal2.bind(this);
}
handleOpenModal1 () {
this.setState({ showModal1: true });
}
handleCloseModal1 () {
this.setState({ showModal1: false });
}
handleOpenModal2 () {
this.setState({ showModal2: true });
}
handleCloseModal2 () {
this.setState({ showModal2: false });
}
render () {
return (
<div>
<button onClick={this.handleOpenModal1}>モーダル1を開く</button>
<ModalComponent
isOpen={this.state.showModal1}
title="ハロー、ワールド!"
content="これはモーダルウィンドウ1のテストです。"
onClose={this.handleCloseModal1}
/>
<button onClick={this.handleOpenModal2}>モーダル2を開く</button>
<ModalComponent
isOpen={this.state.showModal2}
title="こんにちは、ユニバース!"
content="これはモーダルウィンドウ2のテストです。"
onClose={this.handleCloseModal2}
/>
</div>
);
}
}
export default ExampleApp;
上記のコードでは、showModal1
とshowModal2
という二つの state
を用いて、それぞれ異なるモーダルウィンドウを制御しています。
このように、React Modalを活用すれば、一つのウェブページ上で複数のモーダルウィンドウを個別に制御することも可能です。
react-modal とZ-Index: スクロール順の制御
モーダルウィンドウが表示されている間に背後のページがスクロールされてしまうと、モーダルを閉じたときに違うページのような印象を受けるため、ユーザーエクスペリエンスが損なわれてしまいます。
そのため、モーダルウィンドウは、通常、他の全ての要素よりも前面に表示されるべきです。
これは、CSSのプロパティであるz-indexを用いて制御します。
react-modal では、モーダルウィンドウのz-indexをスタイルとして指定することができます。
import React from 'react';
import Modal from 'react-modal';
Modal.setAppElement('#root');
class ExampleApp extends React.Component {
// 以前のコード...
render () {
return (
<div>
<button onClick={this.handleOpenModal1}>モーダル1を開く</button>
<Modal
isOpen={this.state.showModal1}
onRequestClose={this.handleCloseModal1}
style={{
overlay: {
zIndex: 1000
}
}}
>
<h2>ハロー、ワールド!</h2>
<p>これはモーダルウィンドウ1のテストです。</p>
<button onClick={this.handleCloseModal1}>閉じる</button>
</Modal>
// 以前のコード...
</div>
);
}
}
export default ExampleApp;
上記のコードでは、style
propを用いてモーダルウィンドウのz-indexを1000に指定しています。
これにより、他の要素がどのようなz-indexを持っていても、モーダルウィンドウがそれらの上に表示されることを保証することができます。
以上が、react-modal を用いたモーダルウィンドウの作成方法とその応用例です。
React を効率的に身につける勉強法は?
React には興味があっても、プログラミング学習をはじめたばかりであれば、以下のような疑問を持つかもしれません。
- Reactエンジニアとして活躍するために何をすればいい?
- 何から勉強すればいいんだろう?
- 絶対に転職を成功させるには?
React は習得が比較的難しいため、勉強法の選び方を間違うと時間・労力・お金が無駄になってしまいます…。
そのため、こちらの記事を参考に、ご自身に最適な学習方法を選んでみませんか?