React useSyncExternalStore — ブラウザAPIへの安全なサブスクリプション
useSyncExternalStoreを使ってブラウザAPIや外部状態ストアにコンカレントReactで安全にサブスクライブする方法を学びます。オンライン状態、メディアクエリ、Redux統合を網羅。
State Hooks
詳細な説明
useSyncExternalStoreによる外部ストアのサブスクリプション
useSyncExternalStoreはコンカレントReactで外部データソースに安全にサブスクライブする方法を提供し、ティアリング(異なる時点からの不整合なデータの表示)を防ぎます。
3つの引数
- subscribe:コールバックを受け取りアンサブスクライブ関数を返す
- getSnapshot:現在の値を返す(変更されていない場合は同じ参照を返す必要がある)
- getServerSnapshot:SSR用の値を返す(サーバーレンダリングされるコンポーネントに必要)
よくある間違い:毎回新しいオブジェクト
// バグ:毎回新しいオブジェクトを返し、無限再レンダリング
() => ({ width: window.innerWidth, height: window.innerHeight })
// 修正:プリミティブを返すか、オブジェクトをキャッシュ
() => window.innerWidth // プリミティブ -- 安全
使用するタイミング
Reactが管理しない外部状態にuseSyncExternalStoreを使用します:ブラウザAPI、サードパーティ状態管理ライブラリ、共有ミュータブルデータソース。React管理の状態にはuseStateやuseReducerを使用してください。
ユースケース
ブラウザAPI(オンライン状態、メディアクエリ、ジオロケーション)へのサブスクリプション、外部状態管理ライブラリ(Redux、Zustand)のコンカレントReactとの統合、共有ミュータブルデータソースからの読み取りにuseSyncExternalStoreを使用します。