订阅浏览器 API
使用 useSyncExternalStore 构建钩子,订阅 matchMedia、navigator.onLine、窗口历史记录和 localStorage。
订阅浏览器 API 是 CoddyKit 上的免费 React Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。
订阅 matchMedia
浏览器媒体查询是理想的外部存储。您可以订阅用于深色模式或断点的 matchMedia 查询,并在匹配状态切换时重新渲染。
订阅函数向 MediaQueryList 添加变化监听器,getSnapshot 则返回当前的匹配布尔值,从而让您能够响应式地访问响应式条件。
一个 useMediaQuery 钩子
将这套逻辑封装到 useMediaQuery 钩子中后,组件只需调用一次就能询问某个查询是否匹配。该钩子会围绕给定的查询字符串构建稳定的订阅函数和 getSnapshot。
借助 useSyncExternalStore,这就形成了简洁、可复用的响应式行为基础原语,并且在并发渲染下仍能保持一致。
navigator.onLine 状态
浏览器提供在线和离线事件,以及 navigator.onLine。订阅这些事件并读取该属性,就能在 React 中获得实时的连接状态。
getSnapshot 返回 navigator.onLine,订阅函数则为在线和离线事件添加监听器,使组件能够随着连接状态变化而更新。
一个 useOnlineStatus 钩子
将这些逻辑封装到 useOnlineStatus 钩子中后,任何组件都可以在网络断开时显示离线提示或禁用操作。React 官方文档正是使用这个例子来演示该钩子。
这是一个虽小却很有说明性的案例,展示了外部浏览器信号如何自然地映射为一部分响应式状态。
订阅 window.location
您可以通过监听历史记录状态变化事件,并在 getSnapshot 中读取 window.location,来订阅导航变化。这是基于历史记录接口构建简单自定义路由器的基础。
由于 pushState 不会发出历史记录状态变化事件,自定义路由器通常会自行分发事件,使快照也能在程序化导航时更新。
通过存储事件实现 localStorage 跨标签页同步
当 localStorage 发生变化时,存储事件会在其他标签页中触发,因此您可以订阅它作为外部存储。getSnapshot 读取当前值,订阅函数则监听存储事件。
这样即可实现跨标签页同步:在一个标签页中更新值后,另一个标签页中的组件也会响应式地更新。
deviceOrientation
设备方向事件会报告设备的物理倾斜情况。订阅该事件,并在 getSnapshot 中读取最新角度,就能将运动数据转换为响应式状态。
这对于视差效果或交互式可视化很有用,因为它们可以根据手机的握持方式做出响应。
IntersectionObserver 封装器
IntersectionObserver 会告诉您某个元素何时进入或离开视口。您可以对它进行封装,使订阅函数创建观察器,而 getSnapshot 返回最新的 isIntersecting 值。
这样就能获得响应式的 isVisible 标志,用于延迟加载图片、触发动画或实现无限滚动哨兵。
用于元素尺寸的 ResizeObserver
ResizeObserver 会报告元素尺寸的变化。对它进行封装后,订阅函数可以观察元素,getSnapshot 可以返回其当前尺寸,从而让组件精确响应布局变化。
当您关注的是特定元素而不是整个视口时,这比监听窗口大小变化更加高效和准确。
组合为 useWindowSize
您可以将大小变化事件与该钩子结合起来,构建一个返回当前宽度和高度的 useWindowSize。订阅函数添加大小变化监听器,getSnapshot 读取窗口尺寸。
请记得返回稳定的快照:缓存尺寸对象,使未改变的尺寸不会导致重新渲染,从而保持组合逻辑的高效。
快速检查:useMediaQuery 实现
思考 useMediaQuery 钩子如何使用存储钩子。
回顾:订阅浏览器接口
许多浏览器接口都可以作为外部存储,并通过 useSyncExternalStore 连接起来:用于断点的 matchMedia,用于连接状态的 navigator.onLine,用于导航和跨标签页同步的位置与存储,以及方向、交叉检测和大小变化观察器。
它们都遵循相同的结构:一个负责添加和移除监听器的订阅函数,以及稳定的 getSnapshot。您可以将它们组合成 useMediaQuery、useOnlineStatus 和 useWindowSize 等钩子。
常见问题解答
「订阅浏览器 API」课时是免费的吗?
是的 — 「订阅浏览器 API」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。
「订阅浏览器 API」这节课中我会学到什么?
使用 useSyncExternalStore 构建钩子,订阅 matchMedia、navigator.onLine、窗口历史记录和 localStorage。 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 React Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「订阅浏览器 API」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 React Academy 课中编写并运行代码吗?
能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。