LoginSignup
0
0
お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【React】タブ切り替えUIの設計~stateとクエリパラメータ、どちらを使うべきか?~

Last updated at Posted at 2024-06-11

はじめに

実務で、タブを切り替えることで表示するデータを変更するようなUIを実装することになりました。
この実装をするにあたり、設計時に、状態管理の方法として以下の2つのアプローチを検討しました。

  1. Stateによって切り替える方法
  2. クエリパラメーターによって切り替える方法

それぞれの方法にはメリットとデメリットがあるため、これらを比較し、最適な使い分けを考えてみます🎉

結論

先に両者の使い分けについての結論を書いておきます。

stateを使う場合

  • 簡単なUIや内部的なタブ切り替えで、URLの共有を気にする必要がない場合
  • パフォーマンスが重要視される場合

クエリパラメータを使う場合

  • URLの共有やブックマークが重要な場合。例えば、ユーザーが特定のタブの情報を他のユーザーと共有したい場合

メリット・デメリットの比較

stateを使ってタブを切り替える場合

stateを使ってタブを切り替える場合、状態管理が全てReactコンポーネント内に収まるため、以下のようなメリットがあります。

stateでタブを切り替えるメリット

  • 実装がシンプル
  • パフォーマンスがいい
  • 外部依存が少ない

実装がシンプル
「選択されているタブは何か?」というstateを1つ定義するだけで、タブの状態を管理することができます。
コードがシンプルでわかりやすくなります。

パフォーマンスがいい
URLが変更されないので、高速にUIが切り替わります。

外部依存が少ない
React Routerなどの外部ライブラリに依存しません。

一方でURLにタブの状態が含まれないため、以下のようなデメリットがあります。

stateでタブを切り替えるデメリット

  • 指定したタブをURLを共有できない
  • ブラウザのブックマークや履歴が活用できない

指定したタブのURLを共有できない
URLを共有した際にタブの初期状態で開かれてしまいます。
試しにXのHomeにアクセスし、タブを「Following」に切り替えた状態で、URLを共有してみてください。タブが「For You」の状態で開かれるはずです。「Following」タブをURLで誰かに共有することはできません😢

ブラウザのブックマークや履歴が活用できない
ユーザーが特定のタブの状態をブックマークしたり、履歴から特定のタブに戻る・進む操作をすることはできません。

クエリパラメータを使ってタブを切り替える場合

クエリパラメータを使ってタブを切り替える場合、 タブの状態がURLに含まれるため、以下のようなメリットがあります。

クエリパラメータでタブを切り替えるメリット

  • 指定した特定のタブのURLを共有できる
  • ブラウザのブックマークや履歴が活用できる

指定した特定のタブのURLを共有できる
URLを共有した際に直接特定のタブを開くことができます。
試しにXの「Notificaitions」ページで「Mentions」タブに切り替えた状態のこちらのURL(https://twitter.com/notifications/mentions) に遷移してみてください。初めて「Notificaitions」ページを開くと、「All」タブが開かれますが、リンクを開くと「Mentions」タブが開くことが確認できます。

ブラウザのブックマークや履歴が活用できる
ユーザーが特定のタブの状態をブックマークしたり、履歴から特定のタブに戻る・進む操作をすることができます。

一方で、以下のようなデメリットがあります。

クエリパラメータでタブを切り替えるデメリット

  • 実装が複雑になる
  • パフォーマンスが落ちるかも…
  • 外部依存が増える
  • URLが長くなる

実装が複雑になる
クエリパラメータを扱うため、React Routerなどの外部ライブラリとの連携が必要になり、stateだけの実装に比べて複雑になります。

パフォーマンスが落ちるかも…
URLの変更に伴うリダイレクトやページの再レンダリングが発生するため、パフォーマンスが落ちる可能性があります。(まあそこまで気になるレベルではないと思いますが…)

外部依存が増える
状態管理がURLやルーティングに依存するため、React Routerなどの外部ライブラリに依存することになります。

使い分け

両者のメリット・デメリットを考慮すると、以下のような使い分けが良さそうです。

stateを使う場合

  • 簡単なUIや内部的なタブ切り替えで、URLの共有を気にする必要がない場合
  • パフォーマンスが重要視される場合

クエリパラメータを使う場合

  • URLの共有やブックマークが重要な場合。例えば、ユーザーが特定のタブの情報を他のユーザーと共有したい場合

基本的にはstateを使って実装する。ユーザーさんがURLでタブの情報を共有するようなケースが想定される場合は、クエリパラメータを使って実装するという方針が良さそうですね🎉

終わりに

今回の実務では、タブごとの情報を共有するケースがありそうだったので、クエリパラメータを使ってタブを切り替える方法を採用しました。

初心者さんは、ついつい、stateを使って実装しがちですが、必ずしもUXが良いとは限らないので注意しましょう。(最近ハマっているYouTuberのナコンさん風に言ってみました😇)

紹介した2つ以外にも実装方法はありそうですね。いい方法がありましたら教えて下さい🙇

Xで日々の業務や日常を発信しています!
よろしければフォローをお願いします🍢

追記

XのHomeについて、URLにはタブの情報は含まれないのですが、リンクからは開いていたタブに遷移できることがわかりました。何か別の方法でタブの状態を保持しているようです🤔わかる方いらしたら教えて下さい🙇

0
0
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
0
0