”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Zustand源码中的createWithEqualityFnImpl有解释。

Zustand源码中的createWithEqualityFnImpl有解释。

发布于2024-11-08
浏览:179

在这篇文章中,我们将通过记录它的一些值来分析createWithEqualityFnImpl是如何实现的,以便更好地理解。

createWithEqualityFnImpl in Zustand’s source code explained.

从上图可以看出,createWithEqualityFn 调用了函数 createWithEqualityFnImpl。此模式在 vanilla.ts 中使用,如下所示:

export const createStore = ((createState) =>
  createState ? createStoreImpl(createState) : createStoreImpl) as CreateStore

createStore 调用 createStoreImpl 和 createWithEqualityFn 调用 createWithhEqualityFnImpl。

在执行createWithEqualityFn之前,我们首先了解一下使用createWithEqualityFn的目的。

createWithEqualityFnImpl in Zustand’s source code explained.

以上截图来自https://github.com/pmndrs/zustand/tree/main

您可以使用 createWithEqualityFn 来更好地控制重新渲染。

createWithEqualityFn

const createWithEqualityFnImpl = (
  createState: StateCreator,
  defaultEqualityFn?: (a: U, b: U) => boolean,
) => {
  const api = createStore(createState)

  const useBoundStoreWithEqualityFn: any = (
    selector?: any,
    equalityFn = defaultEqualityFn,
  ) => useStoreWithEqualityFn(api, selector, equalityFn)

  Object.assign(useBoundStoreWithEqualityFn, api)

  return useBoundStoreWithEqualityFn
}

useStoreWithEqualityFn

export function useStoreWithEqualityFn>(
  api: S,
): ExtractState

export function useStoreWithEqualityFn, U>(
  api: S,
  selector: (state: ExtractState) => U,
  equalityFn?: (a: U, b: U) => boolean,
): U

export function useStoreWithEqualityFn(
  api: ReadonlyStoreApi,
  selector: (state: TState) => StateSlice = identity as any,
  equalityFn?: (a: StateSlice, b: StateSlice) => boolean,
) {
  const slice = useSyncExternalStoreWithSelector(
    api.subscribe,
    api.getState,
    api.getInitialState,
    selector,
    equalityFn,
  )
  useDebugValue(slice)
  return slice
}

这是一个重载函数。 useStoreWithEqualityFn 有 3 个定义:

export function useStoreWithEqualityFn>(
  api: S,
): ExtractState

export function useStoreWithEqualityFn, U>(
  api: S,
  selector: (state: ExtractState) => U,
  equalityFn?: (a: U, b: U) => boolean,
): U

export function useStoreWithEqualityFn(
  api: ReadonlyStoreApi,
  selector: (state: TState) => StateSlice = identity as any,
  equalityFn?: (a: StateSlice, b: StateSlice) => boolean,
) {

createWithEqualityFnImpl in Zustand’s source code explained.

让我们看看切片值是什么样的:

createWithEqualityFnImpl in Zustand’s source code explained.

value: 1 被跳过,因为我们设置了代码以避免值为 1 时重新渲染,如下所示:

createWithEqualityFnImpl in Zustand’s source code explained.

关于我们:

在 Think Throo,我们的使命是教授受开源项目启发的最佳实践。

通过在 Next.js/React 中练习高级架构概念,提高您的编码技能,学习最佳实践并构建生产级项目。

我们是开源的 — https://github.com/thinkthroo/thinkthroo (请给我们一颗星!)

通过我们基于代码库架构的高级课程来提高您的团队技能。请通过 [email protected] 联系我们以了解更多信息!

参考:

  1. https://github.com/pmndrs/zustand/blob/main/src/traditional.ts#L74

  2. https://github.com/pmndrs/zustand/blob/main/src/traditional.ts#L39



版本声明 本文转载于:https://dev.to/thinkthroo/createwithequalityfnimpl-in-zustands-source-code-explained-3aa0?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 当你开始学习编程语言时会发生什么
    当你开始学习编程语言时会发生什么
    在数字时代,学习编程语言不仅是一种优势,而且是一种必要。无论您的目标是提升职业生涯、构建创新应用程序,还是只是更好地了解数字世界,编程技能都是不可或缺的。让我们深入探讨您应该踏上这一变革之旅的原因和方式。 学习编程语言的重要性 职业发展 根据美国劳工统计局的数据,从 ...
    编程 发布于2024-11-08
  • 如何使用匿名结构或联合编译 C 代码?
    如何使用匿名结构或联合编译 C 代码?
    使用匿名结构/联合编译 C 代码出现了关于如何使用匿名结构或联合编译 C 代码的问题,如C 具有使用联合的匿名字段。在 C 中,尝试使用包含匿名联合的命名结构创建类似的结构会导致编译错误。错误消息表明匿名联合和结构字段未在结构声明中声明。要在 C 中启用此功能,必须使用 -fms-extension...
    编程 发布于2024-11-08
  • 如何使用 OpenSSL 和 C++ 生成 SHA256 哈希值?
    如何使用 OpenSSL 和 C++ 生成 SHA256 哈希值?
    使用 OpenSSL 和 C 生成 SHA256 哈希 哈希是一种加密技术,用于生成数据的唯一指纹或摘要。对于 SHA256(安全哈希算法 2,256 位),此摘要是 256 位十六进制字符串。 SHA256 通常用于检查数据完整性、验证数字签名和安全存储密码。在本文中,我们将介绍如何使用 Open...
    编程 发布于2024-11-08
  • 探索软件工程师的就业市场
    探索软件工程师的就业市场
    Introduction In this article, we dive into the process of extracting and analyzing job data from LinkedIn, leveraging a combination of Python...
    编程 发布于2024-11-08
  • 在 React 中的选项卡之间发送数据。
    在 React 中的选项卡之间发送数据。
    本文将介绍如何在 React 全局组件之间发送数据,甚至在不同的浏览器选项卡中也是如此。 故事 想象您有一个项目列表,例如用户。 每个用户都可以在模态窗口中打开进行修改。 您没有任何后端订阅,这意味着如果用户发生变化,用户列表不会自动与后端同步。 因此,一旦用户的个人资料更新,您希望...
    编程 发布于2024-11-08
  • 如何从 WPF 中的非调度程序线程修改 ObservableCollection?
    如何从 WPF 中的非调度程序线程修改 ObservableCollection?
    “这种类型的 CollectionView 不支持从与调度程序线程不同的线程更改其 SourceCollection”问题描述A DataGrid 绑定异步填充的 ObservableCollection 会抛出错误,指出不允许从非 Dispatcher 线程对 SourceCollection 进...
    编程 发布于2024-11-08
  • 如何使用现代前端开发技术构建令人惊叹的网站
    如何使用现代前端开发技术构建令人惊叹的网站
    在当今的数字时代,网页设计在给访问者留下持久印象方面发挥着至关重要的作用。随着数以百万计的网站争夺注意力,创建一个令人惊叹的、脱颖而出的网站比以往任何时候都更加重要。现代前端开发技术彻底改变了网站的构建方式,使设计美观、实用且响应灵敏的网站变得更加容易,从而提供最佳的用户体验。本文将深入探讨可帮助您...
    编程 发布于2024-11-08
  • 让我们创建一个简单的 React hook 来检测浏览器及其功能
    让我们创建一个简单的 React hook 来检测浏览器及其功能
    用户代理嗅探是最流行的浏览器检测方法。不幸的是,由于多种原因,前端开发不太容易使用它。浏览器供应商不断尝试让嗅探变得不可能。因此,每个浏览器都有自己的用户代理字符串格式,解析起来非常复杂。 有一种更简单的方法可以使用浏览器 CSS API 实现相同的目的,我将向您展示。那么让我们创建浏览器功能检测 ...
    编程 发布于2024-11-08
  • 使用 Golang 的电子商务平台:了解干净的架构
    使用 Golang 的电子商务平台:了解干净的架构
    了解干净的架构 清洁架构(Clean Architecture)由 Robert C. Martin 推广,是一种软件设计理念,它将设计元素划分为环级别。干净架构的主要规则是代码依赖关系只能从外层向内移动。这意味着: 业务规则不依赖于 UI 或数据库。 业务规则对外界一无所知。 U...
    编程 发布于2024-11-08
  • TypeScript 与 JavaScript:开发人员的主要区别
    TypeScript 与 JavaScript:开发人员的主要区别
    JavaScript 是网络的核心语言,而 TypeScript 是基于它的现代增强语言。两者都很强大,但它们的用途略有不同。这是一个快速细分: 1. 类型安全 JavaScript:松散类型。变量可以动态更改类型,从而导致潜在的运行时错误。 TypeScript:静态类型。您定义类...
    编程 发布于2024-11-08
  • JavaScript 能否为不可预测的属性实现动态 Getter 和 Setter?
    JavaScript 能否为不可预测的属性实现动态 Getter 和 Setter?
    JavaScript 可以实现动态 Getters/Setters 吗?动态 getters 和 setters 允许 JavaScript 对象处理超出预定义属性的属性访问和修改。虽然早期的 JavaScript 技术对已知属性使用特定的 getter 和 setter,但本文探讨了为任何未定义的...
    编程 发布于2024-11-08
  • 我的第一个使用 Python 构建的开源项目,通过 CLI 快速检查数据库
    我的第一个使用 Python 构建的开源项目,通过 CLI 快速检查数据库
    我的问题是: 在处理其他项目时,我发现自己总是必须连接并使用 SELECT * 来查看虚拟条目或新用户。我更喜欢使用 CLI 来监视我的数据库条目,特别是因为我正在测试并只是将虚拟用户添加为项目中的第一个普通用户。因此,总是需要连接到 postgres、mysql 并从 CLI 进行 select ...
    编程 发布于2024-11-08
  • PHP,永不倒下的大象!
    PHP,永不倒下的大象!
    照片由 Ben Griffiths 在 Unsplash 上拍摄 PHP是一种广受好评的语言,同时也受到其他人的批评,有人说它正在消亡,但真的是这样吗,值得花时间学习PHP吗? PHP PHP 是 Rasmus Lerdorf 在 90 年代开发的一种编程语言,最初它被开发为一种服务...
    编程 发布于2024-11-08
  • 如何从 Android 应用程序安全访问远程 MySQL 数据库?
    如何从 Android 应用程序安全访问远程 MySQL 数据库?
    使用 JDBC 在 Android 中访问远程 MySQL 数据库:综合分析使用 JDBC API 从 Android 应用程序远程连接到 MySQL 数据库是一种常见的操作移动开发者之间的问题。虽然建立直接连接在技术上是可行的,但它带来了重大的安全和性能问题。安全影响允许 Android 应用程序...
    编程 发布于2024-11-08
  • 使用 CSS 创建自定义鼠标光标
    使用 CSS 创建自定义鼠标光标
    Written by Samson Omojola✏️ Editor’s note: This article was last updated by Njong Emy on 5 August 2024 to update content and code blocks, as well as t...
    编程 发布于2024-11-08

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3