0Pricing
React Academy · 课时

原子:Jotai 中的状态单元

使用 atom() 创建基础原子,并了解 Jotai 无 Provider 设计与 Context 的区别

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

什么是原子?

在 Jotai 中,状态被拆分为原子:小型、独立的响应式状态片段。每个原子只保存一个值,并通过 atom(initialValue) 在组件外部创建。

这体现了将状态拆分为最小有意义单元的思维模型,而不是使用一个庞大的存储对象。

原子具有响应性

当某个原子的值发生变化时,只有订阅了该特定原子的组件会重新渲染。读取其他原子的组件不会受到影响。

这种细粒度响应性是 Jotai 相比 React 上下文的核心优势,因为 React 上下文的值发生任何变化时,所有使用者都会重新渲染。

在组件外部创建原子

请在模块级别定义原子:const countAtom = atom(0)。这样可以确保原子标识在多次渲染之间保持稳定,并且不会在每次组件挂载时重新创建原子。

原子是轻量级引用;它们不保存自己的值。值保存在 Jotai 存储中。

默认无需提供器

默认情况下,Jotai 使用隐式全局存储。您无需将应用包裹在提供器中即可开始使用原子,因此在现有项目中采用起来很简单。

原子可以从组件树中的任意组件访问,无需逐层传递属性或层层传递上下文。

使用显式提供器管理作用域状态

当您需要同一组件树的多个独立实例时(例如两个彼此独立、各自拥有表单状态原子的表单),请将每个实例包裹在 Jotai 提供器中。每个提供器都会创建一个隔离的存储。

这对于微前端架构或包含多个独立状态区域的复杂页面布局很有用。

全局存储与作用域存储

全局存储会在应用的整个生命周期内保留原子。作用域提供器存储会在提供器卸载时重置,非常适合不应全局持久化的模态对话框或页面级状态。

您甚至可以将自定义存储实例传递给提供器,以实现服务端渲染隔离。

Jotai 与 Zustand 的比较

Zustand 使用带有选择器的单一存储对象,以避免不必要的重新渲染。Jotai 将状态拆分为原子,每个组件只订阅它所读取的原子。

对于细粒度的界面状态(单个输入值、切换标志),Jotai 更加自然。对于规模更大且相互关联的应用状态,Zustand 非常合适。

Jotai 与 React 上下文的比较

每当上下文值发生变化时,React 上下文都会重新渲染每个使用者组件,即使使用该上下文的组件只关心上下文对象中的一个字段。

Jotai 解决了这个问题:使用 useAtom(nameAtom) 的组件只会在 nameAtom 发生变化时重新渲染,而不会因其他原子的变化而重新渲染。

原子标识与相等性

Jotai 默认使用 Object.is 比较来判断原子的值是否发生变化。如果您将原子设置为它已经持有的相同值,就不会触发重新渲染。

对于复杂对象,请使用 selectAtom 工具从大型原子中派生出稳定的基本类型值,从而避免在无关字段变化时重新渲染。

原子与 useState

useState 只属于单个组件。原子可以在整个组件树中共享,无需显式传递。当两个同级组件读取同一个原子时,它们会自动保持同步。

这样既无需为了跨组件共享而提升状态,又能将重新渲染控制在最低限度。

实用的原子示例

典型的原子包括:const themeAtom = atom('light')、const cartItemsAtom = atom([])、const selectedUserIdAtom = atom(null)。这些原子只定义一次,之后可以在应用中的任意位置导入。

每个原子彼此独立:更新 cartItemsAtom 不会触发只读取 themeAtom 的组件重新渲染。

Jotai 与 React Context 的重新渲染行为

在重新渲染方面,Jotai 与 React Context 有何不同?

课程回顾

原子是 Jotai 中状态的基本单位,通过在组件外使用 atom(initialValue) 创建。默认情况下,原子可以在整个组件树中共享,无需使用 Provider。当原子发生变化时,只有订阅它的组件会重新渲染。

这种细粒度响应式机制是 Jotai 相比 React Context 的主要优势,其按原子订阅的模型也不同于 Zustand 的单一存储方式。

常见问题解答

「原子:Jotai 中的状态单元」课时是免费的吗?

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

「原子:Jotai 中的状态单元」这节课中我会学到什么?

使用 atom() 创建基础原子,并了解 Jotai 无 Provider 设计与 Context 的区别 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

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

「原子:Jotai 中的状态单元」课时需要多长时间?

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

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

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

此课程中的所有课时

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