useSyncExternalStore 用于安全地订阅外部数据源,确保并发渲染的一致性。

useSyncExternalStore Hook 详解

useSyncExternalStore 用于安全地订阅外部数据源,确保并发渲染的一致性。

// 基本语法

const state = useSyncExternalStore(
  subscribe,         // (callback) => unsubscribe
  getSnapshot,       // () => currentState
  getServerSnapshot  // () => serverState (SSR)
);

示例 1: 基本外部存储

0

原理:

const state = useSyncExternalStore(
  store.subscribe,    // 订阅变化
  store.getState,     // 获取当前状态
  store.getState      // SSR 快照
);

示例 2: 网络状态订阅

🟢

在线

测试方法: 打开浏览器开发者工具,在 Network 面板中切换 “Offline” 模式查看效果。

示例 3: 窗口尺寸订阅

宽度

0px

高度

0px

设备

📱 手机

调整浏览器窗口大小查看实时变化

示例 4: 媒体查询订阅

深色模式

prefers-color-scheme: dark

减少动画

prefers-reduced-motion

大屏幕

min-width: 1024px

竖屏

orientation: portrait

示例 5: 多组件共享状态

总计

0

完成

0

待办

0

暂无待办事项

说明: TodoList 和 TodoStats 是独立组件, 都通过 useSyncExternalStore 订阅同一个外部存储,实现状态共享。

适用场景

  • 订阅浏览器 API(网络状态、窗口尺寸、媒体查询等)
  • 创建状态管理库(如 Zustand、Jotai 内部使用)
  • 订阅第三方数据源
  • 需要并发安全的外部状态订阅

注意: 这是底层 API,普通应用开发者通常使用封装好的库。