在本文中,我们将探讨 Zustand 如何使用 setState 函数实现状态替换,重点关注一个有趣的功能:覆盖状态而不合并。我们将通过一个简单的测试用例来解释如何使用它。
在查看代码之前,了解 合并 和 覆盖 状态之间的区别非常重要。
合并状态: 默认情况下,当您在 Zustand(或 React)中更新状态时,它会将新状态与现有状态合并。仅更新的字段发生更改,而状态的其余部分保持不变。
覆盖状态:相反,覆盖状态用新对象替换整个状态,丢弃先前状态中存在但不属于其一部分的任何字段新状态。
有些情况下需要替换整个状态,例如:
提交表单后重置状态。
加载不同数据集时完全替换状态。
这是来自 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)
3。验证状态替换 最后,测试确保状态已完全替换:
expect(getState()).toEqual({ b: 2 })
期望的是,调用 setState({ b: 2 }, true) 后,store 的状态将只包含 { b: 2 } 而不再包含 { a: 1 }。
下图来自Zustand设置状态的源代码。
如您所见,如果替换标志存在,则 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联系我们了解更多信息!
https://github.com/pmndrs/zustand/blob/v4.5.5/tests/basic.test.tsx#L471C13-L471C50
https://github.com/pmndrs/zustand/tree/v4.5.5?tab=readme-ov-file#overwriting-state
以上是如何覆盖您的 Zustand 状态。的详细内容。更多信息请关注PHP中文网其他相关文章!