人人都会AI编程

Jotai:原子化状态管理

更新时间:2026-07-11

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 往往是最佳选择。