Hooked.
← Hooked.

useSyncExternalStore

公式ドキュメント ↗
useEffectだけではダメな理由
// 素朴な実装(一見動くが、実は危険なケースがある)
const [online, setOnline] = useState(getSnapshot());
useEffect(() => {
  return subscribe(() => setOnline(getSnapshot()));
}, []);

「useEffectの中で値の変化を待ち受けて、setStateする」という書き方は一見動きそうに見える。しかしReact 18以降は複数の更新を並行して処理できるようになった分、タイミングによっては画面の一部が古い値、別の一部が新しい値のまま表示されてしまう(tearingと呼ばれる不整合)ことがある。useSyncExternalStoreは、この問題を避けるために作られた専用のAPIで、外部storeの値を安全に読み取れることをReact側が保証してくれる。

実際の使いどころ

普段のアプリ開発で自分で書く機会は少ないが、身近なライブラリの内部でよく使われている。オンライン状態、画面サイズの条件(メディアクエリ)、別タブでのlocalStorageの変更検知といったブラウザのAPI、あるいはReact以前から使われている外部の状態管理ライブラリをReactに安全につなぐために使われる。