Jotai 是一个轻量级的 React 状态管理库,由 Zustand 的作者开发,其核心理念是原子化(Atomic)状态。它将状态拆分为一个个独立的原子(Atom),每个原子存储一个最小的状态单元,组件可以按需订阅特定的原子,实现极致细粒度的重渲染控制。
核心设计:自底向上的状态组织
与 Redux 那种集中式 Store 不同,Jotai 不需要 Provider 包裹整个应用。状态原子定义在任何地方,使用时自动建立依赖。这种设计就像 React 的 useState 一样简单自然,但状态可以在任意组件间共享。
// 定义一个原子
import { atom } from 'jotai';
const countAtom = atom(0);
基础 API 与实际用法
useAtom:类似 useState 的 hook,读写原子值。
import { useAtom } from 'jotai';
function Counter() {
const [count, setCount] = useAtom(countAtom);
return (
<div>
<p>计数:{count}</p>
<button onClick={() => setCount(c => c + 1)}>+1</button>
</div>
);
}
任何使用了 countAtom 的组件,当原子值变更时,都会自动重渲染。没有使用该原子的组件完全不会受影响——这就是原子化带来的精准更新。
只读或只写的优化:当组件只读不写,可以使用 useAtomValue 避免不必要的更新;只写不读,可以使用 useSetAtom,确保组件不会因为原子值变化而重渲染。
import { useAtomValue, useSetAtom } from 'jotai';
function Display() {
const count = useAtomValue(countAtom); // 只订阅值
return <span>{count}</span>;
}
function IncrementButton() {
const setCount = useSetAtom(countAtom); // 只获取更新函数
return <button onClick={() => setCount(c => c + 1)}>+</button>;
}
派生原子:计算属性自动绑定
Jotai 的原子不仅可以是简单值,还可以派生出新的原子。派生原子可以是同步计算,也可以是异步数据获取。当依赖的原子变化时,派生原子会自动更新。
const doubledAtom = atom((get) => get(countAtom) * 2);
function DoubledDisplay() {
const [doubled] = useAtom(doubledAtom);
return <div>双倍值:{doubled}</div>;
}
异步原子:处理数据请求
原子可以包含异步逻辑,Jotai 会通过 Suspense 或可写的加载态处理异步流程。
const userAtom = atom(async (get) => {
const userId = get(userIdAtom);
if (!userId) return null;
const response = await fetch(`/api/users/${userId}`);
return response.json();
});
function UserProfile() {
const [user] = useAtom(userAtom);
// 可以配合 React.Suspense 处理加载态
return <div>{user.name}</div>;
}
实用场景与优势
- 取代 Context 的性能痛点:Context 值变化会导致所有消费者重渲染,而 Jotai 只更新实际使用该原子的组件。
- 跨组件共享简单状态:如全局主题、语言、用户信息等,比 Redux 轻量得多。
- 细粒度 Form 状态:可以将表单每个字段定义为独立原子,避免一个输入导致整个表单重绘。
- 与 React Hooks 完美融合:API 风格与原生 Hooks 一致,学习成本极低。
边界与注意点
- 调试:原子分散定义,状态流可能不如单 Store 直观,推荐使用 Jotai DevTools。
- 过度拆分:拆得过细会导致原子数量爆炸,建议按逻辑模块组织。
- 服务端渲染:Jotai 天然支持 SSR,原子在客户端和服务器端都能正常工作。
Jotai 特别适合那些需要高效、简洁状态的 React 应用,当你觉得 useState + useContext 带来了不必要的渲染,又懒得引入 Redux 时,Jotai 往往是最佳选择。