AX 爱鲜报

Zustand

Zustand 是面向 React 的轻量级状态管理库,基于简化 Flux 思想,以 Hook 为核心 API,无需 Provider 包裹,体积小、性能好,支持选择器订阅、异步 action、中间件与 TypeScript。

过去 7 天收获 1 颗 Star

爱鲜报评分

0.0

0 人评分

59k

星数

否

中文

TypeScript

主语言

是

活跃

343

贡献者

人工分析

EDITORIAL

推荐理由

Zustand 用极少的样板代码替代 Redux 与 Context,API 直观、上手快,同时妥善处理并发渲染、僵尸子组件、Context 丢失等常见坑。社区活跃、下载量高、生态成熟,是中小型到大型 React 项目状态管理的稳妥选择。

适用场景

  • React 应用全局状态管理
  • 替代 Redux 或 Context 的轻量方案
  • Next.js 客户端状态管理
  • 需要细粒度订阅与减少重渲染的界面
  • 跨组件共享异步请求数据

优点

  • API 简洁,无需 Provider 包裹组件树
  • 按选择器订阅,仅变化时重渲染,性能好
  • 支持中间件、异步 action 与组件外读写状态
  • TypeScript 类型支持完善,体积小
  • 社区活跃、文档与示例丰富

缺点

  • 无强约束架构,大型项目需自行约定规范
  • 在 React Server Components 中直接读写状态需谨慎
  • 复杂派生状态与调试体验不如 Redux DevTools 生态成熟
  • 部分高级用法(自定义相等函数、中间件组合)有一定学习成本
上手难度 入门

简介

Zustand 是一个面向 React 的小型、快速、可扩展的状态管理库,基于简化的 Flux 思想,以 Hook 作为主要使用方式。它没有繁琐的样板代码,也不强制项目结构,因此常被用来替代 Redux 或 React Context。

核心特点

  • Store 即 Hook:通过 create 创建 store,返回的本身就是一个 Hook,可直接在组件中使用。
  • 无需 Provider:不像 Context 那样需要包裹组件树,任意组件都能直接访问。
  • 选择器订阅:默认使用严格相等比较,只订阅需要的状态片段,减少不必要的重渲染。
  • 组件外读写:提供 getState、setState、subscribe 等工具方法,便于在非组件环境操作状态。
  • 中间件生态:内置 subscribeWithSelector、persist、devtools 等中间件,可按需组合。

快速上手

先创建一个 store:

import { create } from 'zustand'

const useBearStore = create((set) => ({
  bears: 0,
  increasePopulation: () => set((state) => ({ bears: state.bears + 1 })),
  removeAllBears: () => set({ bears: 0 }),
}))

然后在组件中直接使用:

function BearCounter() {
  const bears = useBearStore((state) => state.bears)
  return <h1>{bears} around here ...</h1>
}

function Controls() {
  const increasePopulation = useBearStore((state) => state.increasePopulation)
  return <button onClick={increasePopulation}>one up</button>
}

常用技巧

选取多个状态片段

需要同时取多个字段时,可配合 useShallow 避免对象或数组每次都是新引用而触发重渲染:

import { useShallow } from 'zustand/react/shallow'

const { nuts, honey } = useBearStore(
  useShallow((state) => ({ nuts: state.nuts, honey: state.honey })),
)

异步 action

Zustand 不限制 action 是否异步,准备好数据后调用 set 即可:

const useFishStore = create((set) => ({
  fishies: {},
  fetch: async (pond) => {
    const response = await fetch(pond)
    set({ fishies: await response.json() })
  },
}))

组件外访问状态

const paw = useDogStore.getState().paw
const unsub = useDogStore.subscribe(console.log)
useDogStore.setState({ paw: false })
unsub()

与 Redux / Context 的对比

  • 相比 Redux:更少样板代码、不强制 action/reducer 结构、无需 Provider。
  • 相比 Context:集中式管理、按需订阅、仅在相关状态变化时重渲染。

适用建议

Zustand 适合希望以低心智负担管理 React 全局状态的团队。项目规模变大时,建议自行约定 store 拆分与命名规范,并结合中间件处理持久化、调试等需求。

评论

登录后才可评论与评分

0 条评论

  • 暂无评论,来写第一条吧。