灏天阁

useSyncExternalStore 解析

· Yin灏

useSyncExternalStore 是 React Hooks 中的一个自定义 Hook,用于将外部状态(例如浏览器 localStorage 或服务端数据)同步到组件中。

它需要接收三个参数:

  • getState: 一个函数,用于获取外部状态。
  • setState: 一个函数,用于将外部状态同步到组件中。
  • isEqual: 一个可选的函数,用于比较两个值是否相等,默认使用严格相等(===)。

当组件渲染时,useSyncExternalStore 会通过 useEffect 监听外部状态的变化,并在必要时调用 setState 更新组件内部状态。同时,useSyncExternalStore 还会在组件卸载时清除监听器,以避免内存泄漏。

以下是一个示例:

import { useState } from "react";
import { useSyncExternalStore } from "./useSyncExternalStore";

function MyComponent() {
  const [count, setCount] = useState(0);

  useSyncExternalStore(
    () => localStorage.getItem("count"),
    (value) => setCount(parseInt(value)),
    (a, b) => parseInt(a) === parseInt(b)
  );

  const handleClick = () => setCount(count + 1);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={handleClick}>Increment</button>
    </div>
  );
}

在这个示例中,当 MyComponent 渲染时,会创建一个 count 状态和一个 useSyncExternalStore 调用。useSyncExternalStore 中定义了一个监听 localStorage 中名为 count 的值的变化,并在变化时更新组件内部状态。同时,useSyncExternalStore 还通过自定义的相等比较函数来判断两个值是否相等。当点击 “Increment” 按钮时,会更新 count 状态,并将新值同步到 localStorage 中。

需要注意的是,在使用 useSyncExternalStore 时,需要确保外部状态可以被正确读取和写入。否则可能会导致数据不一致或其他异常情况。

- Book Lists -