タブ間で Storage イベントを処理する
storage イベントリスナーを使って、ほかのブラウザータブでの localStorage の変更に反応します。
「タブ間で Storage イベントを処理する」はCoddyKit上の無料React Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはReact Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 React Academyコースには全4レッスンが含まれています。
タブ間で状態が古くなる問題
ユーザーがアプリを2つのタブで開いていて、タブAで値を更新しても、タブBには古い状態が表示されたままです。両方のタブがlocalStorageを共有していても、それぞれがメモリ上に独自のReact状態を持っているからです。
調整を行わなければ、タブ間で現在の値が食い違います。
storageイベントは他のタブで発生する
ブラウザーは、localStorageが変更されるたびに、同じオリジンの他のタブでstorageイベントを発生させます。重要なのは、変更を行ったタブでは発生しないことです。
これは、タブBがタブAで何かが更新されたことを知るために必要なシグナルそのものです。
addEventListenerで監視する
useEffect内でwindow.addEventListener('storage', handler)を呼び出し、イベントリスナーを削除するクリーンアップ関数を返します。これにより、コンポーネントがタブ間の変更を購読できます。
エフェクトはマウント時に一度だけ実行すればよいため、空の依存配列または安定した依存配列が適しています。
StorageEventのプロパティ
イベントオブジェクトには、key(変更されたキー)、oldValueとnewValue(変更前後の文字列)、storageArea(影響を受けたストレージオブジェクト)が含まれます。
nullのキーとnull値の組み合わせは、ストレージ全体が消去されたことを意味します。
対象のキーだけに絞り込む
storageイベントはオリジン内のすべてのキーに対して発生するため、ハンドラーは反応する前にevent.key === yourKeyを確認する必要があります。無関係なキーを無視すると、不要な再レンダーを避けられます。
また、event.newValueがnullになる場合、つまりキーが削除された場合も処理します。
イベントでReactの状態を更新する
関連する変更を受け取ったら、event.newValueをパースし、セッターを呼び出してReactの状態を更新します。これにより、2つ目のタブが別の場所で行われた変更と同期します。
useLocalStorageフックと組み合わせることで、タブ間の同期が完成します。
BroadcastChannelという選択肢
BroadcastChannelを使うと、同じオリジンのタブ同士がpostMessageで直接メッセージを送信できます。ストレージイベントを流用するよりもすっきりしており、localStorageに書き込まなくても動作します。
名前を指定してチャンネルを作成し、更新を投稿して、messageイベントを監視します。
ストレージにuseSyncExternalStoreを使う
Reactには、外部ストアを並行レンダリングに安全な方法で購読するためのuseSyncExternalStoreがあります。そのsubscribe関数をstorageイベントに、snapshotをlocalStorageの読み取りに接続できます。
これにより、外部ストレージの更新をReactのレンダリングと正しく統合できます。
タブ間ログアウトのユースケース
典型的な用途は、すべての場所からログアウトさせることです。1つのタブが認証フラグを消去すると、他のタブのstorageイベントがそれを検出し、ログイン画面へリダイレクトします。
これにより、古い状態のタブが認証済みコンテンツを表示し続けるのを防げます。
タブ間でダークモードを同期する
テーマも適した例です。1つのタブでダークモードを切り替えるとlocalStorageに書き込まれ、他のタブでstorageイベントが発生し、それぞれのテーマ状態がすぐに一致するよう更新されます。
ユーザーはどのタブに切り替えても、一貫した表示を利用できます。
全体を組み合わせる
タブ間の同期は、storageイベントを監視するかBroadcastChannelを使い、対象のキーだけに絞り込み、新しい値でReactの状態を更新することで実現できます。
堅牢で並行レンダリングにも安全な購読には、useSyncExternalStoreが最新の選択肢です。
理解度チェック
タブ間イベントについて理解度を確認しましょう。
まとめ
storageイベントが他のタブで発生すること、監視方法、キーによる絞り込み、状態の更新方法を学びました。また、BroadcastChannelとuseSyncExternalStoreという選択肢についても学びました。
すべての場所からのログアウトや、タブ間でのダークモード同期といった実際のユースケースも確認しました。
よくある質問
「タブ間で Storage イベントを処理する」レッスンは無料ですか?
はい。「タブ間で Storage イベントを処理する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、React Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 React Academyコースには全4レッスンが含まれています。
「タブ間で Storage イベントを処理する」で何を学びますか?
storage イベントリスナーを使って、ほかのブラウザータブでの localStorage の変更に反応します。 ブラウザで直接実行するハンズオンコードでReact Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
React Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのReact Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「タブ間で Storage イベントを処理する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このReact Academyレッスンでコードを書いて実行できますか?
はい。すべてのReact Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- React で localStorage を読み書きする
- 状態を localStorage と同期する
- タブ間で Storage イベントを処理する
- sessionStorage、IndexedDB、適切な API の選び方