4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

window.confirmのように手軽に使用できるReactの確認ダイアログコンポーネントを作成してみました

Posted at

背景

ちょっと確認ダイアログを出したい際にwindow.confirmのように手軽に使用できるReactコンポーネントがあると便利だと思い、作ってnpmレジストリで公開してみました。

作ったもの

dc4089ac937ea1b4feebd98d2367b88b.gif

オプションでダイアログタイトル・メッセージ・OK/キャンセルのテキスト・カラーを設定できるようにしてます。

インストール・使用方法

以下GitHubのREADMEにインストール・使用方法を記載していますので、よかったら使ってみてください。

kamiya-kei/simple-confirm/README.md

制作メモ

window.confirmは以下の様に使用すると「OK」を選択するとtrue、キャンセルを選択するとfalseが返ってきます。

const is_ok = window.confirm('本当によろしいですか?');

同じような感じで以下のように使用できるようにしました。

const is_ok = await simpleConfirmRef.current.confirm();

子コンポーネント側の関数を呼び出せるようにする為にReact.useImperativeHandleを使用し、結果を同期的に受け取れるようにする為にPromise・Async/Awaitを使用しました。

上記コードを実行すると、下記コードのconfirm関数が呼び出されるようになっています。

  useImperativeHandle(ref, () => ({
    confirm: () => new Promise((resolve, reject) => {
      setHandleAgree(() => () => {
        resetHandle();
        resolve(true);
      });
      setHandleDisagree(() => () => {
        resetHandle();
        resolve(false);
      });
      setHandleClose(() => () => {
        resetHandle();
        resolve(false);
      });
      setOpen(true);
    }),
  }));

コンポーネント全体のソースコードはこちらです。
https://github.com/kamiya-kei/simple-confirm/blob/main/src/index.js

最後に

そもそもuseImperativeHandleは手続き的であり、あまり積極的に使用するべきではないといったことも書かれていたのですが、確認ダイアログを表示してその選択結果によって処理するといったことをする場合に宣言的かつシンプルで分かりやすいコードの書き方が思いつかず、手続き的な書き方をしました。
Reactは最近使い始めたばかりでまだ分かっていない部分も多いので、もっと勉強してより良い書き方ができるようにしていきたいと思います。

参考記事

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?