news 2026/4/23 14:47:32

Jotai:轻量原子化,React 状态管理的甜心魔法!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Jotai:轻量原子化,React 状态管理的甜心魔法!

你是否曾被 React 应用中复杂的状态管理所困扰?是不是觉得状态就像一团缠绕不清的毛线,每次修改都小心翼翼,生怕牵一发而动全身?别担心,今天我们要介绍一位来自日本的甜心小天使——Jotai!它以“原子”般轻巧灵活的理念,让你的状态管理变得简单、直观,就像在玩一场可爱的积木游戏!

什么是 Jotai?原子般轻巧的魔法!

Jotai,在日语中意为“原子”,正如其名,它将应用的状态拆解成一个个独立、微小的“原子(atom)”。每个原子都代表着应用中的一小块状态,它们可以独立存在,也可以像乐高积木一样自由组合,构建出复杂而强大的应用状态。这种**原子化(atomic)**的设计思想,让状态管理变得前所未有的清晰和高效。你不再需要面对一个庞大的全局 Store,而是专注于管理一个个小巧玲珑的原子,是不是听起来就很治愈呢?

Jotai 的甜心哲学:简单、灵活、高性能

Jotai 的设计哲学可以用三个词来概括:简单(Simple)灵活(Flexible)高性能(Performant)

  • 简单:Jotai 的 API 非常简洁直观,你只需要掌握几个核心概念,就能轻松上手。它避免了 Redux 等库中繁琐的配置和样板代码,让你的代码更加干净、易读。
  • 灵活:原子之间可以自由组合,形成各种复杂的状态派生。你可以根据业务需求,创建只读原子、可写原子,甚至异步原子,满足各种场景的需求。
  • 高性能:Jotai 只会重新渲染那些真正使用了被更新原子的组件,而不是整个组件树。这意味着你的应用将拥有更快的响应速度和更流畅的用户体验,就像小鸟一样轻盈!

拥抱 TypeScript:类型安全的甜蜜保障

对于 TypeScript 的忠实拥趸来说,Jotai 简直是天作之合!Jotai 对 TypeScript 的支持非常友好,它大量利用了 TypeScript 的**类型推断(type inference)**能力,让你的代码在享受类型安全的同时,依然保持简洁。当然,如果你需要更精确的类型控制,Jotai 也提供了明确的类型定义方式,让你的代码在甜美的同时,也拥有坚实的保障。

Jotai 核心概念:一起玩转小原子!

1.atom():创造你的第一个小原子

atom()是 Jotai 的基石,它用于创建一个原子。你可以给原子一个初始值,就像给你的小宠物起个名字一样。

import{atom}from'jotai';// 创建一个存储计数器值的原子,初始值为0constcountAtom=atom(0);// 创建一个存储用户姓名的原子,初始值为'Guest'constuserNameAtom=atom('Guest');// 创建一个存储布尔值的原子,表示加载状态constisLoadingAtom=atom(false);

2.useAtom():在组件中拥抱原子

useAtom()是一个 React Hook,它允许你在函数组件中读取和更新原子。它会返回一个数组,第一个元素是原子的当前值,第二个元素是更新原子的函数,就像 React 的useState一样,是不是很熟悉呢?

importReactfrom'react';import{atom,useAtom}from'jotai';constcountAtom=atom(0);functionCounter(){const[count,setCount]=useAtom(countAtom);return(<div><p>当前的计数是:{count}</p><button onClick={()=>setCount(c=>c+1)}>加一</button><button onClick={()=>setCount(c=>c-1)}>减一</button></div>);}exportdefaultCounter;

3. 派生原子:聪明的原子会思考!

Jotai 最强大的特性之一就是派生原子(derived atoms)。你可以基于一个或多个现有原子,创建新的原子。这些派生原子会根据它们所依赖的原子自动更新,就像拥有了智慧一样!

派生原子可以是**只读(read-only)的,也可以是可读写(read-write)**的。

只读派生原子

只读派生原子通过一个函数来获取其值,这个函数接收一个get函数作为参数,get函数用于读取其他原子的值。

import{atom,useAtom}from'jotai';constpriceAtom=atom(10);constquantityAtom=atom(2);// 派生一个只读原子,计算总价consttotalAtom=atom((get)=>get(priceAtom)*get(quantityAtom));functionShoppingCart(){const[price]=useAtom(priceAtom);const[quantity]=useAtom(quantityAtom);const[total]=useAtom(totalAtom);return(<div><p>单价:{price}</p><p>数量:{quantity}</p><p>总价:{total}</p></div>);}exportdefaultShoppingCart;
可读写派生原子

可读写派生原子除了读取逻辑外,还包含一个写入逻辑。写入逻辑接收getset函数和更新值作为参数。set函数用于更新其他原子。

import{atom,useAtom}from'jotai';consttextAtom=atom('Hello Jotai!');// 派生一个可读写原子,用于将文本转换为大写constuppercaseTextAtom=atom((get)=>get(textAtom).toUpperCase(),(get,set,newText:string)=>set(textAtom,newText.toLowerCase()));functionTextInput(){const[uppercaseText,setUppercaseText]=useAtom(uppercaseTextAtom);return(<div><input type="text"value={uppercaseText}onChange={(e)=>setUppercaseText(e.target.value)}/><p>原始文本:{textAtom}</p>{/* 注意:这里直接访问textAtom是错误的,应该通过useAtom */}<p>大写文本:{uppercaseText}</p></div>);}exportdefaultTextInput;

小提示:在上面的TextInput组件中,直接访问textAtom是无法获取其最新值的,因为textAtom本身是一个原子定义,而不是其值。正确的方式是像uppercaseTextAtom一样,通过useAtom来获取其值。

Jotai 与 TypeScript 的亲密接触

Jotai 在 TypeScript 环境下表现出色,它能很好地推断原子的类型。让我们看几个例子:

import{atom}from'jotai';// 类型推断为 numberconstnumAtom=atom(123);// 类型推断为 stringconststrAtom=atom('Jotai is cute!');// 显式指定类型constuserAtom=atom<{id:number;name:string}>({id:1,name:'Alice'});// 派生原子的类型推断constdoubledNumAtom=atom((get)=>get(numAtom)*2);// 类型推断为 numberconstgreetingAtom=atom((get)=>`Hello,${get(userAtom).name}!`);// 类型推断为 string

总结:Jotai,你的 React 应用新宠!

Jotai 以其独特的原子化设计、简洁的 API、卓越的性能以及对 TypeScript 的完美支持,成为了 React 状态管理领域的一颗璀璨新星。它让状态管理不再是令人头疼的难题,而是一场充满乐趣的创造之旅。如果你正在寻找一个轻量、灵活、高性能的状态管理方案,那么 Jotai 绝对值得你一试!快来拥抱这个甜心小原子,让你的 React 应用闪闪发光吧!

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

跨平台文件传输效率工具:告别数据线,实现多设备无缝共享

跨平台文件传输效率工具&#xff1a;告别数据线&#xff0c;实现多设备无缝共享 【免费下载链接】NearDrop An unofficial Google Nearby Share app for macOS 项目地址: https://gitcode.com/gh_mirrors/ne/NearDrop 你是否曾遇到这样的窘境&#xff1a;MacBook里的工作…

作者头像 李华
网站建设 2026/4/23 11:19:11

突破跨平台存储限制:macOS网络存储解决方案全解析

突破跨平台存储限制&#xff1a;macOS网络存储解决方案全解析 【免费下载链接】iSCSIInitiator iSCSI Initiator for macOS 项目地址: https://gitcode.com/gh_mirrors/is/iSCSIInitiator 在数字化工作流中&#xff0c;你是否经常面临Mac存储空间不足的困境&#xff1f;…

作者头像 李华
网站建设 2026/4/23 5:05:30

5个实用技巧:用HamburgerMenu构建高颜值的WPF教育医疗界面

5个实用技巧&#xff1a;用HamburgerMenu构建高颜值的WPF教育医疗界面 【免费下载链接】MahApps.Metro A framework that allows developers to cobble together a better UI for their own WPF applications with minimal effort. 项目地址: https://gitcode.com/gh_mirrors…

作者头像 李华
网站建设 2026/4/23 1:23:01

SmokeAPI完全指南:免费体验游戏DLC的终极方案

SmokeAPI完全指南&#xff1a;免费体验游戏DLC的终极方案 【免费下载链接】SmokeAPI Legit DLC Unlocker for Steamworks 项目地址: https://gitcode.com/gh_mirrors/smo/SmokeAPI SmokeAPI是一款专业的Steamworks DLC所有权模拟工具&#xff0c;能够帮助正版游戏玩家解…

作者头像 李华