0Pricing
React Academy · 课时

Jotai、Zustand 与 Context:如何选择

比较 Jotai 的原子模型、Zustand 的状态库和 React Context,为不同使用场景选择合适的工具

Jotai、Zustand 与 Context:如何选择 是 CoddyKit 上的免费 React Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

React Context:最佳使用场景

React Context 适合用于很少变化的全局值:当前主题、用户区域设置、身份验证状态或设计系统令牌。这些值通常只设置一次,在一次会话中很少被修改。

该接口内置于 React 中,无需依赖项,并能清楚地向团队传达“此值在全局共享”。

React Context:重新渲染的缺点

当上下文值对象发生变化时(即使只改变了一个字段),每个使用者都会重新渲染。对于稳定的全局配置,这可以接受;但对于表单输入或界面动画标志等高频变化的状态,这会造成灾难性的影响。

将上下文拆分为更小的部分可以缓解这一问题,但在规模扩大后,这种模式会变得难以管理。

Zustand:最佳使用场景

Zustand 适合处理中等频率变化的全局应用状态:用户偏好、购物车、导航历史或多步骤向导状态。基于选择器的订阅可以避免无关状态切片引发重新渲染。

这种基于存储的模型对 Redux 用户来说很熟悉,并且会将相关状态集中在一个位置。

Zustand 接口与选择器

Zustand 存储会导出一个 useBoundStore 钩子。传入一个选择器:useStore(state => state.cart),即可只订阅购物车状态切片。使用不同选择器的组件彼此独立;使用购物车选择器的组件不会因用户名发生变化而重新渲染。

这让 Zustand 具备与 Jotai 类似的按切片效率,同时提供了更具命令式风格的接口。

Jotai:最佳使用场景

Jotai 非常适合细粒度响应式状态,即许多较小且相互独立的值会频繁变化的场景:单个表单字段的值、每行的选择标志、界面切换状态或实时数据订阅。

其每个值对应一个原子的模型,在组件树的不同部分需要完全不同的状态切片时非常自然。

程序包体积与接口风格对比

Jotai 的程序包比 Zustand 更小,因为它包含的功能更少(没有中间件系统,也没有内置开发者工具)。Jotai 的接口与 useState 非常相似(useAtom 返回 [value, setter]),因此可以降低 React 开发者的学习曲线。

Zustand 的接口更接近 Redux:定义存储、导出钩子、使用选择器。两个库都提供出色的 TypeScript 支持。

SSR 与 TypeScript 支持

Jotai 和 Zustand 都支持服务器端渲染,但需要采用适当的水合策略。Jotai 在 SSR 中使用带有自定义存储的 Provider;Zustand 使用 createStore 创建服务器实例。

两者都提供一流的 TypeScript 泛型支持,无需手动添加类型注解,即可完整推断原子值和存储值的类型。

混合使用状态方案

实际应用通常会组合使用三者:React Context 用于静态配置(API 基础网址、功能标志),Jotai 或 Zustand 用于交互式客户端状态,React Query 或 SWR 用于服务器获取的数据。

这些层次并不冲突。根据每个状态切片的性质有意地混合使用它们,是一种架构最佳实践。

根据团队熟悉程度选择

如果您的团队有 Redux 使用经验,Zustand 的存储模型会让人感到很自然。如果您的团队对 React 原生开发非常熟悉,类似 useState 的 API 学习成本最低。

对于大多数应用来说,团队熟悉程度比细微的性能差异更重要。

根据状态复杂度选择

简单的页面状态,只有几个开关:使用 useState 或 Context 就足够了。中型应用中的跨组件状态:使用 Zustand 或 Jotai。具有几十个相互独立的响应式值的高度交互式界面:Jotai 更具优势。

对于需要缓存、后台刷新和乐观更新的复杂服务器数据,可以将任意客户端状态库与 React Query 结合使用。

决策框架总结

对于静态或很少变化的全局值,请使用 Context。对于更新频率适中的集中式应用状态,请使用 Zustand。对于以原子为粒度、具有许多独立订阅的细粒度响应式状态,请使用 Jotai。对于服务器状态,请使用 React Query 或 SWR。

这些类别并非互斥;按照状态类型分层使用它们,可以形成清晰且高性能的架构。

何时使用 Jotai 而不是 Context

在状态管理方面,什么时候 Jotai 比 React Context 更合适?

课程回顾

React Context 最适合静态全局配置;Zustand 适合通过选择器订阅的集中式应用状态;Jotai 适合细粒度的原子状态,尤其是在许多相互独立的值频繁更新时。三者都可以与 React Query 这样的服务器状态库互相配合。

请选择时应考虑更新频率、状态复杂度和团队熟悉程度。按照状态类别混合使用这三者,是有效且常见的生产环境模式。

常见问题解答

「Jotai、Zustand 与 Context:如何选择」课时是免费的吗?

是的 — 「Jotai、Zustand 与 Context:如何选择」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「Jotai、Zustand 与 Context:如何选择」这节课中我会学到什么?

比较 Jotai 的原子模型、Zustand 的状态库和 React Context,为不同使用场景选择合适的工具 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。

「Jotai、Zustand 与 Context:如何选择」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 原子:Jotai 中的状态单元
  2. 使用 useAtom 读取和写入原子
  3. 派生原子与异步原子
  4. Jotai、Zustand 与 Context:如何选择
← 返回 React Academy