首页 > web前端 > js教程 > 如何覆盖您的 Zustand 状态。

如何覆盖您的 Zustand 状态。

DDD
发布: 2024-09-19 06:31:03
原创
1108 人浏览过

在本文中,我们将探讨 Zustand 如何使用 setState 函数实现状态替换,重点关注一个有趣的功能:覆盖状态而不合并。我们将通过一个简单的测试用例来解释如何使用它。

How to override your Zustand state.

了解状态合并与状态覆盖

在查看代码之前,了解 合并覆盖 状态之间的区别非常重要。

  • 合并状态: 默认情况下,当您在 Zustand(或 React)中更新状态时,它会将新状态与现有状态合并。仅更新的字段发生更改,而状态的其余部分保持不变。

  • 覆盖状态:相反,覆盖状态用新对象替换整个状态,丢弃先前状态中存在但不属于其一部分的任何字段新状态。

何时覆盖状态

有些情况下需要替换整个状态,例如:

  • 提交表单后重置状态。

  • 加载不同数据集时完全替换状态。

覆盖 Zustand 状态的测试用例

这是来自 Zustand 代码库的一个简单测试用例,演示了如何使用 setState 函数覆盖状态:

it('can set the store without merging', () => {
  const { setState, getState } = create<{ a: number } | { b: number }>(
    (_set) => ({
      a: 1,
    }),
  )

  // Should override the state instead of merging.
  setState({ b: 2 }, true)
  expect(getState()).toEqual({ b: 2 })
})
登录后复制

分解测试

1。创建商店 首先,创建一个 Zustand 商店,其初始状态为:

const { setState, getState } = create<{ a: number } | { b: number }>(
    (_set) => ({
      a: 1,
    }),
  )
登录后复制

初始状态是一个对象,其单个属性设置为 1。create 函数返回两个基本方法:

  • setState:此方法用于更新商店的状态。

  • getState: 此方法检索存储的当前状态。

2。覆盖状态 这里的关键操作是将当前状态 { a: 1 } 替换为全新的状态:

setState({ b: 2 }, true)
登录后复制
  • 通过传递 true 标志作为第二个参数,Zustand 知道它应该覆盖状态,而不是将新对象 { b: 2 } 与现有对象合并。这完全取代了之前的状态,因此 { a: 1 } 被删除,新状态变为 { b: 2 }。

3。验证状态替换 最后,测试确保状态已完全替换:

expect(getState()).toEqual({ b: 2 })
登录后复制

期望的是,调用 setState({ b: 2 }, true) 后,store 的状态将只包含 { b: 2 } 而不再包含 { a: 1 }。

Zustand 如何覆盖状态

下图来自Zustand设置状态的源代码。

How to override your Zustand state.

如您所见,如果替换标志存在,则 nextState 成为新状态。

(replace ?? (typeof nextState !== 'object' || nextState === null))
登录后复制

这是一个聪明的方法,如果替换为 false(默认情况下),则检查 (typeof nextState !== ‘object’ || nextState === null)) 条件。

结论

Zustand 提供了一种在 React 中管理状态的简单方法,并且使用带有覆盖标志的 setState 完全覆盖状态的能力提供了额外的灵活性。无论您想要重置表单、加载新数据还是清除旧值,此功能都可以让您完全控制应用程序中状态的管理和更新方式。

关于我们:

在 Think Throo,我们的使命是教授开源项目中使用的高级代码库架构概念。

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

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

通过我们基于代码库架构的高级课程来提高您的团队的技能。请通过hello@thinkthroo.com联系我们了解更多信息!

参考资料:

  1. https://github.com/pmndrs/zustand/blob/v4.5.5/tests/basic.test.tsx#L471C13-L471C50

  2. https://github.com/pmndrs/zustand/tree/v4.5.5?tab=readme-ov-file#overwriting-state

以上是如何覆盖您的 Zustand 状态。的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板