React useSyncExternalStore

作用: useSyncExternalStore 是 React 18 中引入的 Hook,用于在 React 组件中安全地订阅外部(非 React)数据源,同时保持与 React 的更新机制同步。它是 useSubscription Hook 的官方替代,为集成如 Redux 或 MobX 这样的外部状态管理库提供了一个标准化的方式,同时支持 React 的并发模式(Concurrent Mode)。

用法: useSyncExternalStore 接受三个参数:

  1. subscribe:这是一个函数,它接收一个监听器(listener callback)。当外部数据源发生变化时,监听器应被调用,提示 React 需要获取新的数据快照。
  2. getSnapshot:一个函数,返回与外部数据源当前状态相对应的值。
  3. getServerSnapshot(可选):仅在服务端渲染(Server-Side Rendering, SSR)中使用的函数,返回与外部数据源当前状态相对应的值。

示例: 假设我们有一个简单的外部数据源 store,它有 subscribegetState 方法:

javascript 复制代码
const store = {
  subscribe(callback) {
    // 订阅变化,当数据更新时调用 callback
  },
  unsubscribe(callback) {
    // 取消订阅
  },
  getState() {
    // 获取当前状态
    return someData;
  }
};

现在,我们可以使用 useSyncExternalStore 来订阅这个 store

javascript 复制代码
import { useSyncExternalStore } from 'react';

function MyComponent() {
  const state = useSyncExternalStore(
    // 订阅函数
    (callback) => {
      store.subscribe(callback);
      return () => store.unsubscribe(callback);
    },
    // 快照获取函数
    () => store.getState()
  );

  // 使用 state 渲染你的组件
  return <div>{state}</div>;
}

使用注意事项:

  1. 性能考虑 :确保 subscribe 函数不会在组件每次渲染时都创建新的订阅,这可能会导致内存泄漏。
  2. 监听器调用 :监听器应该被调用在任何可能导致 getSnapshot 返回值变化的情况下,以确保组件能够重新渲染。
  3. 避免副作用getSnapshotgetServerSnapshot 应该是纯函数,它们不应有副作用,也不应更改应用状态。
  4. 并发模式兼容性 :当使用 React 的并发模式时,useSyncExternalStore 确保组件状态与外部数据源同步,并减少不一致的可能性。
  5. SSR 兼容性 :确保在服务端渲染环境中提供 getServerSnapshot 函数,并处理数据获取和同步,以避免客户端和服务器的渲染不一致。

useSyncExternalStore 提供了一种标准化的方式来确保 React 组件与外部数据源保持同步,同时兼容 React 的新特性和并发模式。正确使用此 Hook 可以帮助开发者避免与状态订阅相关的常见陷阱。

相关推荐
gnip3 小时前
企业级配置式表单组件封装
前端·javascript·vue.js
一只叫煤球的猫3 小时前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
excel4 小时前
Three.js 材质(Material)详解 —— 区别、原理、场景与示例
前端
掘金安东尼5 小时前
抛弃自定义模态框:原生Dialog的实力
前端·javascript·github
hj5914_前端新手8 小时前
javascript基础- 函数中 this 指向、call、apply、bind
前端·javascript
薛定谔的算法8 小时前
低代码编辑器项目设计与实现:以JSON为核心的数据驱动架构
前端·react.js·前端框架
Hilaku9 小时前
都2025年了,我们还有必要为了兼容性,去写那么多polyfill吗?
前端·javascript·css
yangcode9 小时前
iOS 苹果内购 Storekit 2
前端
LuckySusu9 小时前
【js篇】JavaScript 原型修改 vs 重写:深入理解 constructor的指向问题
前端·javascript
LuckySusu9 小时前
【js篇】如何准确获取对象自身的属性?hasOwnProperty深度解析
前端·javascript