news 2026/6/15 12:48:08

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. 最佳实践:让应用更健壮

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

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

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

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

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

    • 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/6/14 1:29:07

人类最强的思维库:不是鸡汤,是能拿去用、能赚钱、能破局的那种

一、第一性原理思维&#xff08;所有强者的底层操作系统&#xff09; 一句话&#xff1a;把世界拆到不能再拆&#xff0c;然后从零开始重建。 问法模板&#xff1a; 这件事本质上是什么&#xff1f;哪些是物理/数学/人性不可违背的约束&#xff1f;哪些只是习惯、权威、共识、行…

作者头像 李华
网站建设 2026/6/9 14:33:30

我常用的爬虫利器,无脑采集Tiktok shop视频数据

爬虫为什么难&#xff1f; 爬虫是网络数据采集的简称&#xff0c;顾名思义就是利用http请求技术向网站发送数据请求&#xff0c;然后进行html解析并提取到需要的数据&#xff0c;可以使用Python等工具实现&#xff0c;这个过程看似简单&#xff0c;但暗藏很多机关&#xff0c;…

作者头像 李华
网站建设 2026/6/9 23:56:38

Java高频面试题:Java中变量和常量有什么区别?

大家好&#xff0c;我是锋哥。今天分享关于【Java高频面试题&#xff1a;Java中变量和常量有什么区别?】面试题。希望对大家有帮助&#xff1b;Java高频面试题&#xff1a;Java中变量和常量有什么区别?在Java中&#xff0c;变量和常量都是存储数据的手段&#xff0c;但它们在…

作者头像 李华
网站建设 2026/6/15 12:36:23

豆瓣电影大数据分析系统定制(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

豆瓣电影大数据分析系统定制(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 可要求使用组件&#xff0c;代码分析为主&#xff0c;可加推荐算法&#xff0c;可视化组件按要求来&#xff0c;动态展示没问题。系统定制时间按需&…

作者头像 李华
网站建设 2026/6/15 12:37:40

2026年不容错过!免费AI搜索优化(GEO)监测工具盘点

现在&#xff0c;DeepSeek、Kimi、ChatGPT这些AI搜索工具越来越普及&#xff0c;GEO&#xff08;生成式引擎优化&#xff09;成了企业必须关注的事情。选对工具&#xff0c;能让你的品牌在AI搜索里更容易被看见。我们整理了2026年最值得关注的九款GEO工具&#xff0c;从它们的功…

作者头像 李华