Open5

React Routerでactionのあとにモーダルを閉じたい

adwdadwd

ユーザーリスト画面にユーザー作成ボタンがあり、押すとユーザー作成モーダルが開く。
モーダル内に入力して保存ボタンを押すとユーザーが作成されモーダルが閉じる。
ユーザー個別に編集画面があり、編集したり削除したりできる。

こういうUIをReact Routerでどう実装するのがいいか?
React RouterのactionはReactコンポーネントではないためフックやContextが使えない。

このポストのまとめ的なスクラップ
https://x.com/adwd118/status/1842125426367631709

adwdadwd

まずURLにモーダルの状態を乗せるかどうかという仕様をどちらにするかで実装方針はほぼ決まる。
どっちでもいいので実装が楽で少なく済む方法でいうとどちらもあまり差がなさそう。
割と頻出パターンな気がするので公式にこうしろと言ってもらってそれに乗りたいかもしれない

adwdadwd

モーダルの状態をURLに乗せるか

/users?modal=open/users/create /users/1/edit のようなURLに対してモーダルを割り当てる。
これまであまり見ないスタイルだと思うが最近実際のサービスで見るのとNext.jsのParallel Routesはそれが前提になっている

  • Pros
    • URLにモーダルの状態が乗るので戻る・進むで行き来できる
    • /users/1/edit みたいなURLを共有できる
  • Cons
    • 戻る・進むでモーダルが開閉するのは不自然に感じるかもしれない
adwdadwd

Outletを使ってRouteをネストさせてURLにモーダルの状態を乗せる

/users/create /users/1/edit /users/1/delete に対してモーダルを表示するコンポーネントを割り当てる。
/users のコンポーネントに <Outlet /> を使い、ユーザーリスト上にモーダルが表示されるようにする。
actionでは redirect('/users/)replace('/users') を使う

  • Pros
    • react-routerの機能で完結して実装できる
    • モーダルの状態をRouteに割り当てているのでルーティングの制御をすればモーダルの状態を制御できる
  • Cons
    • モーダルの種類だけRouteが増えるのでやや煩雑?
    • replace を使うと履歴に /users が2つ連続する
adwdadwd

モーダルの開閉を状態管理で行う

useState や状態管理ライブラリでモーダルの開閉を管理する

  • Pros
    • URLにモーダルの状態が乗らない
  • Cons
    • Reactコンポーネントではないactionで状態を触りにくい
      • jotaiだとstoreを使ってReactコンポーネント外で状態を変化できる。その場合Providerが必要だったりしてやや煩雑