zustand
一句话
小巧(~1KB)、无 Provider、基于 hooks 的 React 状态管理库,用简单的 store 函数代替 Context 样板代码,是"轻量但够用"这一档的首选。
核心心智模型
create()定义一个 store,返回一个可直接在组件里当 hook 用的函数。- 组件通过 selector 订阅 store 的某个切片:
const bears = useStore(s => s.bears),只有这个切片变化才会触发重渲染(默认按引用比较,避免了 Context 的"整棵树全刷新"问题)。 - state 更新用
set((state) => ({...})),不强制 immutable/reducer 范式,但可选配合 immer middleware。 - store 是普通模块状态,可以在组件外部读写(用于非 React 代码、测试、跨组件通信),不像 Redux 需要
<Provider>包裹。
最小示例
import { create } from 'zustand'
const useBearStore = create((set) => ({
bears: 0,
increase: () => set((state) => ({ bears: state.bears + 1 })),
}))
function BearCounter() {
const bears = useBearStore((state) => state.bears)
return <h1>{bears} bears</h1>
}
什么时候选它
- 中小型应用/组件树,想要比 Context+useReducer 更省事,但又不想引入 Redux 的 action/reducer/dispatch 三件套。
- 需要跨组件共享状态、且更新频繁(避免 Context 重渲染性能问题)。
- 想要 store 逻辑可以脱离 React 独立测试(store 就是普通函数,不依赖组件树)。
- 需要中间件(persist 持久化、devtools、immer、subscribeWithSelector)时也有官方支持。
什么时候不选它 / 替代方案
| 场景 | 更合适的选择 |
|---|---|
| 只是父子组件间传值,层级不深 | 直接 props 或 useState |
| 只是低频、简单的全局配置(主题、语言) | React Context 就够 |
| 强团队规范、需要严格的 action 审计/时间旅行调试、大型企业应用 | Redux Toolkit |
| 状态天然是"服务端数据缓存"(请求/loading/缓存/重试) | TanStack Query(配合 zustand 管纯客户端状态) |
| 偏好 atom 化、细粒度依赖追踪的写法 | Jotai / Recoil |
优缺点
优点:API 极简、几乎零样板、无需 Provider、按需订阅性能好、TS 类型推导友好、体积小、可脱离 React 使用。
缺点:没有 Redux 那种强约束和成熟的 DevTools 时间旅行生态(虽然有 devtools middleware 但没那么完整);缺乏内置的强 action 规范,团队大了容易写法不统一。
相关信息
- 文档:https://zustand.docs.pmnd.rs
- Star 数:56.9k+,pmndrs 系(同系还有 jotai、react-three-fiber)出品,生态成熟、维护活跃。