【React / Next.js】createPortalでmodalコンポーネントを作る
やりたいこと
モーダルは画面最前面に表示させることの多い性質上、body
タグ直下にレンダリングしたいことがよくある。
そこで親コンポーネントより外にDOMをレンダリングできるReact Portalを使い、モーダルコンポーネントを実装してみる。
実装方法
1. モーダルの雛形を作る
まずはprops
で渡されたchildren
と、閉じるボタンを描画する簡素なコンポーネントを作る。
- ボタンをクリックするとモーダルが開く
- モーダル内のxボタンをクリックするとモーダルが閉じる
上記要件を満たすように追記。
canCloseByClickingBackground
がtrue
の時は、背景をクリックしてもモーダルが閉じるようにする。
2. createPortalでレンダリング
createPortal
を使い、body
タグ直下にモーダルをレンダリングさせる。
第1引数にはレンダリングしたい要素を、第2引数にはレンダリング先のノードを指定。
3. スタイルの設定
あとはモーダルっぽいUIにしたいので、modal.module.css
を作成。
4. コンポーネントを呼び出す
あとは今回実装したコンポーネントを呼び出す。モーダル内に表示したい要素をchildren
として渡せばOK。
無事モーダルが表示され、
body
タグ直下の最後尾にレンダリングされていた 🎉
5. テスト実装
最低限のテストも実装し、無事通った。