useSyncExternalStore subscribes to external stores with tear-free reads.
Code:
1import { useSyncExternalStore } from "react";23// External store4let listeners: Array<() => void> = [];5let state = { count: 0 };67function subscribe(callback: () => void) {8 listeners.push(callback);9 return () => {10 listeners = listeners.filter(l => l !== callback);11 };12}1314function getSnapshot() {15 return state;16}1718function increment() {19 state = { ...state, count: state.count + 1 };20 listeners.forEach(l => l());21}2223// Component24function Counter() {25 const { count } = useSyncExternalStore(subscribe, getSnapshot);26 return (27 <div>28 <p>Count: {count}</p>29 <button onClick={increment}>Increment</button>30 </div>31 );32}
Parameters:
subscribe — function to subscribe to store changesgetSnapshot — function to get current valuegetServerSnapshot — (optional) for SSRUse cases:
Example — online status:
1function useOnlineStatus() {2 return useSyncExternalStore(3 (callback) => {4 window.addEventListener("online", callback);5 window.addEventListener("offline", callback);6 return () => {7 window.removeEventListener("online", callback);8 window.removeEventListener("offline", callback);9 };10 },11 () => navigator.onLine,12 () => true // SSR fallback13 );14}1516function StatusBar() {17 const isOnline = useOnlineStatus();18 return <div>{isOnline ? "Online" : "Offline"}</div>;19}
Benefits: