news 2026/10/7 13:14:20

Jotai库

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Jotai库

Jotai 是一个用于 React 的状态管理库,它采用了一种“原子化”的模型,旨在通过简单、灵活的方式管理应用状态。下面我从五个方面,结合具体实践,为你讲解它的核心内容。

1. 它是什么:用积木构建状态的思路

你可以把 Jotai 想象成用乐高积木搭建状态。在 React 中,每个组件有自己的小状态(useState)。而 Jotai 将这种思路扩展到全局:每一块最小的“状态积木”就是一个原子(Atom)。

一个原子可以存储任何数据(数字、字符串、对象、数组)。你的整个应用状态,就是由这些独立的原子,或者由它们组合、计算出来的新原子(派生原子)所构成的。这与把全部家当放进一个大箱子(如 Redux 的单一 Store)不同,Jotai 让你可以自由地组合和拆分这些小箱子。

2. 它能做什么:解决状态共享与衍生问题

Jotai 的核心作用是管理 React 组件之间需要共享和衍生的状态。它主要解决以下问题:

  • 跨组件状态共享:让多个分散的组件能轻松读写同一份数据,无需层层传递属性(Props)。

  • 自动计算衍生状态:当一个状态依赖于另一个或多个状态时,可以自动、高效地同步更新。例如,一个“在线好友列表”原子可以自动从“所有好友”原子中过滤生成。

  • 优化渲染性能:得益于原子化的设计,当某个原子更新时,只通知真正依赖它的组件重新渲染,避免了 Context 可能带来的不必要的全局重渲染问题。

  • 支持异步操作:原子可以直接包含异步逻辑(如数据请求),并能够与 React 的Suspense无缝集成。

3. 怎么使用:从定义到消费的三步

使用 Jotai 通常遵循创建、提供、消费三个步骤。其核心 API 非常精简,学习成本较低。

第一步:安装与项目设置

bash

npm install jotai # 或使用 yarn/pnpm

在应用根组件,通常需要用Provider包裹,以提供状态作用域。

jsx

import { Provider } from 'jotai'; function App() { return ( <Provider> <MyComponent /> </Provider> ); }

第二步:创建与使用原子
下面通过一个计数器示例,展示原子的核心用法:

原子类型代码示例说明
基础原子const countAtom = atom(0);创建存储数字的基础原子。
派生原子(只读)const doubledAtom = atom((get) => get(countAtom) * 2);通过get函数依赖其他原子,自动计算衍生值。
派生原子(可写)const decrementAtom = atom(<br> (get) => get(countAtom), // 读<br> (get, set) => { // 写<br> set(countAtom, get(countAtom) - 1);<br> }<br>);同时提供读写函数,可在此更新其他原子。
组件内使用const [count, setCount] = useAtom(countAtom);使用方式与useState几乎一致。

第三步:优化消费模式
为了进一步提升性能,Jotai 提供了更细粒度的 Hook,可以按需使用:

  • useAtomValue(atom):仅订阅原子的值,用于只读场景。

  • useSetAtom(atom):仅获取更新函数,用于只写场景,组件不会因原子值变化而重渲染。

4. 最佳实践:让应用更健壮

在真实项目中,遵循一些模式可以让状态管理更清晰、高效。

  • 保持原子细粒度:就像用一个个小盒子分类收纳,而不是一个大杂物箱。将逻辑上独立的状态拆分为不同的原子(如userAtom,themeAtom),有利于复用和性能优化。

  • 封装复杂逻辑于派生原子:将涉及多个状态的计算、过滤、组合逻辑封装到派生原子中。这样组件只需关心结果,实现了关注点分离。

  • 使用工具函数处理常见需求:jotai/utils包提供了处理常见需求的原子,能简化开发:

    • atomWithStorage:轻松实现状态在localStorage或sessionStorage中的持久化。

    • atomFamily:管理动态或按参数区分的原子组,例如为每个用户ID创建独立的原子。

    • selectAtom/focusAtom:当原子存储一个较大对象时,允许组件只订阅或修改对象的特定部分,避免不必要的渲染。

  • 合理划分 Provider 作用域:通过在应用不同层级嵌套Provider,可以创建独立的状态作用域。这在微前端、模块化应用或需要状态隔离的场景中非常有用,且卸载Provider时其下的所有原子状态会自动重置。

5. 和同类技术对比:如何选择

选择状态管理库时,需考虑团队习惯和项目需求。下表对比了 Jotai 与几个主流方案:

特性JotaiRedux ToolkitZustandRecoil
设计模型原子模型(自底向上组合)单一Store(集中式, 分片)单一Store(集中式)原子模型(类似 Jotai)
API风格Hooks风格,类似useState分片 (Slice) + ActionStore Hook, 直接定义状态和更新函数Hooks + Selector
学习曲线平缓(核心API极简)较陡(概念较多,如action/reducer/middleware)平缓(API直观)中等 (概念与 Jotai 类似,但有字符串key等差异)
性能优化自动优化(依赖追踪,更新精确)需手动优化(如shallowEqual)自动优化(选择性订阅)自动优化
典型适用场景1. 替代useState + Context
2. 需要细粒度响应式更新
3. 需要良好代码分割
1. 大型、复杂应用,需要强流程约束和可预测性
2. 重度依赖中间件生态
1. 需要轻量、简单的全局Store
2. 需要集成Redux DevTools
与 Jotai 场景高度重叠,但该库已归档,社区活跃度降低

总而言之,Jotai 凭借其原子化、低样板代码和符合直觉的 Hooks API 设计,非常适合用于构建现代化 React 应用。它在性能、开发体验和灵活性之间取得了良好平衡。

在实际项目中,如果想深入了解特定场景(如与 Next.js 深度集成、处理极其复杂的状态流),可以随时提出更具体的问题。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 5:06:43

MobX库,深度详解

从处理数据和状态的角度来看&#xff0c;MobX 可以被理解为一套高效的状态管理机制。它的核心目标是让应用中的数据变化能够自动、精确地驱动用户界面的更新。1. 它是什么&#xff1f;可以把它想象成一个智能的仓库管理员。假设你的应用状态是一个仓库里的货物清单。传统方式中…

作者头像 李华
网站建设 2026/10/6 1:12:06

FPGA实现双线性插值缩放:代码与实现详解

fpga实现双线性插值缩放代码及资料在数字图像处理领域&#xff0c;双线性插值是一种常用的技术&#xff0c;用于图像的缩放、旋转和剪切等操作。而在硬件加速方面&#xff0c;FPGA&#xff08;现场可编程门阵列&#xff09;因其高度的并行处理能力和灵活的架构&#xff0c;成为…

作者头像 李华
网站建设 2026/10/7 0:33:04

百思数据治理大模型(BS-LM)技术白皮书(上篇)

当前&#xff0c;数据已跃升为数字经济的核心生产要素&#xff0c;但传统依赖人工与静态规则的数据治理模式&#xff0c;正面临规则僵化、语义割裂、知识难沉淀等系统性挑战&#xff0c;严重制约了数据价值的释放。行业亟需一场从“规则驱动”到“智能驱动”的范式变革。 为此…

作者头像 李华
网站建设 2026/10/7 0:33:52

百思数据治理大模型(BS-LM)技术白皮书(下篇)

当前&#xff0c;数据已跃升为数字经济的核心生产要素&#xff0c;但传统依赖人工与静态规则的数据治理模式&#xff0c;正面临规则僵化、语义割裂、知识难沉淀等系统性挑战&#xff0c;严重制约了数据价值的释放。行业亟需一场从“规则驱动”到“智能驱动”的范式变革。 为此…

作者头像 李华
网站建设 2026/10/6 5:07:26

备考软考高项,怕踩坑?这份全网零差评名师清单,助你一次通关!

去年备考信息系统项目管理师时&#xff0c;我最大的焦虑不是教材多厚、考点多难&#xff0c;而是——该跟哪位老师学&#xff1f; 网上信息满天飞&#xff0c;试听课听了好几节&#xff0c;还是怕选到“水货”老师&#xff0c;白白浪费一年一次的机会。 直到我跟着一份真实考生…

作者头像 李华