0Pricing
React Academy · 课时

使用 useAtom 读取和写入原子

使用 useAtom、useAtomValue 和 useSetAtom 在整个组件树中读取和更新原子

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

useAtom:主要钩子

useAtom(someAtom) 返回 [value, setter],与 useState 接口相似。值是当前的原子状态;设置函数会更新它。当组件既要读取原子又要写入原子时,请使用此钩子。

设置函数既可以接收新值,也可以接收更新函数:setCount(c => c + 1)。

useAtomValue:只读访问

useAtomValue(someAtom) 只返回当前值,不提供设置函数。当组件只读取状态而从不修改状态时,请在仅用于显示的组件中使用它。

由于组件不持有设置函数引用,代码清楚地表达了其意图:这是一个纯读取组件。

useSetAtom:只写访问

useSetAtom(someAtom) 只返回设置函数。关键在于,它不会让组件订阅原子的值。原子发生变化时,组件不会重新渲染。

对于按钮这类仅执行操作的组件,请使用它们:这类组件会分发状态更改,但不会显示任何派生界面。

useSetAtom 为何有利于性能

调用 useSetAtom(countAtom) 来增加计数器的组件,在 countAtom 发生变化时不会重新渲染,因为它没有订阅值。只有显示计数的组件会重新渲染。

这是一个简单但强大的优化:将写入方与读取方解耦,避免级联重新渲染。

使用 atomWithStorage 实现持久化

从 jotai/utils 导入 atomWithStorage。它的用法与 atom() 完全相同,但要将存储键作为第一个参数传入:atomWithStorage('theme', 'light')。该原子会自动与 localStorage 同步。

页面重新加载时,该原子会从 localStorage 进行水合。所有读取该原子的组件都会立即获取持久化的值。

重置 atomWithStorage

可以将 jotai/utils 中的 RESET 符号传给 atomWithStorage 原子的设置函数:setter(RESET)。这会清除 localStorage 条目,并将原子重置为其初始值。

在设置页面中,这适用于注销流程或“重置为默认值”按钮。

使用 atomFamily 创建原子族

jotai/utils 中的 atomFamily 会创建一个工厂函数,该函数返回参数化原子。例如,atomFamily(id => atom(null)) 会为传入的每个唯一标识符创建一个单独的原子。

对于 selectedAtom(itemId) 或 expandedAtom(rowId) 这类按项目管理的状态,这种方式非常理想,无需维护一个庞大的映射原子。

原子族清理

如果标识符不断累积,原子族可能会无限增长。请使用 atomFamily.setShouldRemove((createdAt, param) => ...) 定义清理谓词,Jotai 会在决定淘汰过期的原子族成员时调用它。

对于项目会不断添加和删除的列表,请在删除项目时始终清理原子族条目,以避免内存泄漏。

Jotai DevTools

jotai-devtools 软件包提供一个可视化面板,用于列出所有活动原子及其当前值。安装该软件包后,将应用包装在 DevTools 中,即可实时检查原子状态。

每次原子更新都会记录更新前后的值,因此调试复杂的原子交互会变得非常直接。

选择性重新渲染示例

在大型列表中,ListContainer 组件可以使用 useSetAtom(selectedIdAtom) 更新选择状态,而无需订阅 selectedIdAtom。只有调用 useAtomValue(selectedIdAtom) 的各个 ListItem 组件会在选择状态变化时重新渲染。

这种模式具有良好的扩展性:添加数千个列表项目也不会拖慢选择状态的更新。

组合三个钩子

请选择与组件需求相匹配的钩子:纯显示使用 useAtomValue,纯操作使用 useSetAtom,需要读写两者时使用 useAtom。这种有意识的接口设计让组件的职责一目了然。

表单字段组件通常使用 useAtom;提交按钮使用 useSetAtom;显示计数的标签使用 useAtomValue。

useSetAtom 与 useAtom

使用 useSetAtom 而不是 useAtom 的主要优势是什么?

课程回顾

useAtom 同时提供值和设置函数;useAtomValue 只提供值(读取订阅);useSetAtom 只提供设置函数(值发生变化时不会重新渲染)。atomWithStorage 会将状态持久化到 localStorage,并支持 RESET;atomFamily 会为动态列表创建按参数区分的原子。

选择正确的钩子可以最大限度地减少不必要的重新渲染,并明确表达组件的意图。

常见问题解答

「使用 useAtom 读取和写入原子」课时是免费的吗?

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

「使用 useAtom 读取和写入原子」这节课中我会学到什么?

使用 useAtom、useAtomValue 和 useSetAtom 在整个组件树中读取和更新原子 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

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

「使用 useAtom 读取和写入原子」课时需要多长时间?

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

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

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

此课程中的所有课时

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