Elsaの技術日記(徒然なるままに)

主に自分で作ったアプリとかの報告・日記を記載

MENU

Reactでポップアップメニューを自作する

今回はReactでポップアップメニューを自作する方法に関してまとめていきます。

先日から活用しているモグラたたきアプリに関して、終了時に終了メッセージを表示させていたのですが、
当初alertを用いて実装していました。

ただ、、
alert表示場所が中央に表示されないので分かりにくい!!
ということで中央に表示させるべく、ポップアップメッセージを自作することに。



■最終系

今回作成したポップアップメッセージはこちら。
f:id:Elsammit:20211204215733g:plain

このように、終了したらポップアップメッセージを中央に表示させることが出来ました。

ソースコードに関して

ソースコードは下記に保存しております。
GitHub - Elsammit/Moguratataki

■自作ポップアップメッセージを作成

まずは表示させるポップアップメッセージを作成していきます。
コードはこちら。
[dialog.tsx]

import React from 'react';
import "./dialog.css";

export default class MadeDialog extends React.Component<Props> {
    CloseDialog = () => {
    }

    render() {
        return (
        <div>
            <div className="overlay">   
                <div className="content">
                    <p className='finsMsg'>"Game Finish!!"</p>
                    <p><button className='closeBtn' onClick={this.CloseDialog}>close</button></p>
                </div>
            </div>
        </div>
    )}
}

メッセージ表示とボタンが配置されたwindowを1つ用意しているのみになります。
ボタンをクリックするとCloseDialog関数がコールされます。

モグラたたき終了時にポップアップメニューを表示

では終了時に先ほど作成したポップアップメニューを表示させてみます。

まず先ほど作成したポップアップメッセージを表示させるためには、

import MadeDialog from './dialog'
<MadeDialog></MadeDialog>

というように作成したクラスをimportし、付与した名前でタグを生成すればOKです。

今回のケースはモグラたたき終了時にポップアップメッセージですので、

    OpenDialog = () =>{
        const {popupstate} = this.state;
        const{result} = this.state;
        if(popupstate === true){
            return <MadeDialog></MadeDialog>
        }else{
            return <p></p>
        }
    }

といったOpenDialog関数を作成し、
popupstateがtrueの時にMadeDialogがコールされポップアップメッセージが表示。
falseの時に別タグがコールされポップアップメッセージ非表示としました。
今回は割愛しますが、モグラたたき終了時にpopupstateをtrueにするようにしています。

■ポップアップメッセージを閉じる処理を追加

先ほどのコードでモグラたたきが終了すればpopupstateがtrueになり、
自作ポップアップメッセージが表示されます。

しかし、現在のコードではポップアップメッセージを閉じることが出来ません。
そこで次にポップアップを閉じるための処理を追加していきます。

まずはポップアップメッセージclass側を改造し、ボタンをクリックした時にcloseするための処理を追加していきます。
コードはこちら。

import React from 'react';
import "./dialog.css";

 //追加
export interface Props { 
    closeState?:any;
}

export default class MadeDialog extends React.Component<Props> {
    CloseDialog = () => {
        this.props.closeState(false); //←追加
    }

    render() {
        return (
        <div>
            <div className="overlay">   
                <div className="content">
                    <p className='finsMsg'>"Game Finish!!"</p>
                    <p><button className='closeBtn' onClick={this.CloseDialog}>close</button></p>
                </div>
            </div>
        </div>
    )}
}

追加したのは、

export interface Props { 
    closeState?:any;
}

    CloseDialog = () => {
        this.props.closeState(false); //←追加
    }

です。
closeStateを定義してボタンがクリックされた時に、closeStateにfalseをセットしています。

次にモグラたたき側のコードを変更していきます。
変更箇所はこちら。

   // 追加.
    updateState = (state:boolean)=>{
        this.setState({popupstate:state});
    }

    OpenDialog = () =>{
        const {popupstate} = this.state;
        const{result} = this.state;
        if(popupstate === true){
            return <MadeDialog closeState={this.updateState.bind(this)}></MadeDialog> //←closeState追加
        }else{
            return <p></p>
        }
    }

MadeDialogタグですが、

<MadeDialog closeState={this.updateState.bind(this)}}></MadeDialog>

の通り、closeState={this.updateState.bind(this)}}を付与しております。
こちらはcloseStateが変化した時にupdateState関数がコールバックされるコードになります。
そして、updateState関数ですが

    updateState = (state:boolean)=>{
        this.setState({popupstate:state});
    }

と定義しております。
updateState関数の引数であるstateですが、今回はcloseStateの値が格納されます。
先ほどのポップアップメッセージ側でボタンをクリックした際にfalseがセットされるので、
popupstateにはfalseがセットされます。

これでボタンをクリックした際に、
closeStateにfalse ⇒ updateState関数コール ⇒ popupstateにfalseがセット ⇒ ポップアップメッセージが閉じる
が実現出来ました。

■最後に

これでモグラたたき終了時に、
 ・popupstateがtrueになりポップアップメッセージが表示
 ・ポップアップメッセージのボタンクリックでpopupstateがfalseになりポップアップメッセージが閉じる
が実現出来ました。

長々と書いてしまいましたが、
案外簡単に実装できるので試してみてください。