createWithEqualityFn 是 Zustand 核心 API 的一个特殊变体,它创建了一个具有内置相等性检查功能的 React hook。该函数允许开发者创建可以优化组件重新渲染时机的 store,通过提供自定义的相等性函数来进行状态比较。
有关不带相等性检查的标准 store 创建函数的信息,请参阅 create。
createWithEqualityFn 通过允许您指定一个自定义相等性函数来扩展 Zustand 的基本 store 创建功能,该函数决定何时应发生重新渲染。当组件使用此 store 选择一部分状态时,相等性函数会决定新状态是否与先前状态“相等”,从而可能避免不必要的重新渲染。
来源: src/traditional.ts57-90 docs/apis/create-with-equality-fn.md7-14
该函数接受两个参数
stateCreatorFn: 一个接收 set、get 和 store 参数并返回初始状态(包含任何 action)的函数。equalityFn: (可选) 一个用于比较前一个和下一个状态切片以确定相等性的函数。返回值是一个 React hook,可以直接在组件中使用,并附带 Zustand store API 的实用方法。
来源: src/traditional.ts57-66 docs/apis/create-with-equality-fn.md34-37
createWithEqualityFn 返回的 hook 具有以下行为:
hook 还附带了所有 Zustand store API 方法: getState()、setState()、subscribe()、getInitialState()。
来源: src/traditional.ts49-55 docs/apis/create-with-equality-fn.md50-55
createWithEqualityFn 的内部实现包含几个关键方面:
createWithEqualityFn 首先使用 Zustand 的核心 createStore 函数创建一个 vanilla store。useStoreWithEqualityFn,而 useStoreWithEqualityFn 本身是 React 的 useSyncExternalStore 的包装器。返回 hook 的关键实现位于 useStoreWithEqualityFn 函数中,该函数使用 React 的同步机制来高效地管理订阅和更新。
createWithEqualityFn 和标准的 create 函数的主要区别在于:
| 功能 | create | createWithEqualityFn |
|---|---|---|
| 相等性检查 | 使用严格相等性 (Object.is) | 允许自定义相等性函数 |
| 重新渲染控制 | 基础 | 通过自定义相等性实现精细控制 |
| 实现 | 使用 React.useSyncExternalStore | 使用 useSyncExternalStoreWithSelector |
| 外部依赖 | 无 | 传统版本需要 use-sync-external-store |
来源: src/react.ts43-64 src/traditional.ts57-90
一个常见的用例是创建一个使用对象浅比较的 store,这对于具有顶层属性的状态对象更有效。
来源: docs/apis/create-with-equality-fn.md67-91
您还可以为不同的组件或状态选择使用不同的相等性函数。
来源: docs/apis/create-with-equality-fn.md151-160
了解其实现有助于有效使用 createWithEqualityFn。
来源: src/traditional.ts68-82 src/traditional.ts33-47
实现依赖于以下关键组件:
当组件重新渲染时,hook 会根据比较先前和当前选定状态时相等性函数的结果来决定是否触发另一次渲染。
为了有效地使用 createWithEqualityFn:
选择正确的相等性函数:
shallow。注意相等性函数的性能:
优先使用细粒度的选择器:
来源: docs/apis/create-with-equality-fn.md448-606
如果状态更新没有导致重新渲染:
true。来源: docs/apis/create-with-equality-fn.md520-524 docs/apis/create-with-equality-fn.md574-585
如果您正在使用传统版本并遇到错误:
Error: Cannot find module 'use-sync-external-store/shim/with-selector'
您需要安装依赖项:
npm install use-sync-external-store
来源: docs/apis/create-with-equality-fn.md11-13
createWithEqualityFn 是 Zustand 中一系列相关 API 的一部分。