前端发展到今天,写页面已经不是最难的了,管理好你的状态,才是决定项目维护是否“秃头”的关键。
今天我们来聊聊前端项目开发中的一个关键角色:Zustand,全家桶里那个长得最不像状态管理库的状态管理库。
为什么我们需要 Zustand?
现代前端开发,已经离不开这两个东西:
- 组件化 UI(React 做得非常好)
- 全局状态管理(React 没有内置,只能靠 useContext/useReducer 或第三方库)
咱们可以类比一下开发体验:
| 场景 | 体验 |
|---|---|
| 写组件 | 像在组装乐高,挺开心的 |
| 管状态 | 像在捋猫的毛,理顺了是顺毛猫,理乱了天天挠你 |
而 React 自带的 useContext + useReducer,用在小项目里勉强凑合,但一到中大型项目,就会变成这样:
“这个状态我要传到六层孙组件,怎么整?”
“UI 和状态绑死了,改起来一地鸡毛!”
所以我们需要一个更解耦、灵活、高性能的状态管理方案 —— Zustand 登场!
🐻 Zustand 是谁?
Zustand 是德语,意思是“状态”,它是 React 状态管理库中的极简派代表。
它解决了什么问题?
- 不用写模板代码(你没听错,什么 action、reducer 全都没有)
- 没有 Provider,不用写 Provider,不用写 Provider(重要的事情说三遍)
- 用起来像
useState一样自然 - 性能还非常好,默认就是按字段“细颗粒度更新组件”
一句话总结:
Zustand = useState 的全局版,配上极简 API,天生不爱折腾!
小项目要不要用 Zustand?
我们先抛一个灵魂问题:
“小项目到底要不要上 Zustand 或 store 系统?”
答案是:没必要!
在小项目中,组件状态有限,页面结构简单,useState + props 搞定一切,不需要上 store。
但!一旦你项目复杂了,比如:
- 页面一多,组件嵌套层级深
- 多页面之间共享状态(比如登录用户、权限)
- 有较复杂的 UI 状态同步需求(tab、过滤器、loading)
这个时候,状态就该统一收归中央,让 store 接管人生。
🧩 中大型项目:Zustand + Router,状态集中式管理才是正解
当项目走上正轨,React Router 和 Zustand 强强联手,UI 和逻辑自然分离:
// 项目结构示意
src/
├── stores/ // 所有全局状态集中于此
│ ├── userStore.js
│ ├── uiStore.js
│ └── todoStore.js
├── pages/ // 路由页面组件
├── components/ // 可复用的 UI 单元
└── App.jsx // 路由总入口
状态集中管理的好处?
✅ 状态在哪里改,去哪找,一目了然
比如你的 checkbox 状态用 zustand 管理,只需要:
const isDark = useUiStore((s) => s.darkMode)
const toggle = useUiStore((s) => s.toggleDarkMode)
页面直接读状态和方法,组件瞬间“无脑纯净”。
Zustand 怎么用?(3分钟就能上手)
安装:
npm i zustand
创建 store:
// stores/countStore.js
import { create } from 'zustand'
export const useCountStore = create((set) => ({
count: 0,
increase: () => set((state) => ({ count: state.count + 1 })),
}))
使用:
import { useCountStore } from './stores/countStore'
function Counter() {
const count = useCountStore((s) => s.count)
const increase = useCountStore((s) => s.increase)
return (
<>
<h2>{count}</h2>
<button onClick={increase}>+1</button>
</>
)
}
多 store 管理逻辑清晰
Zustand 完全支持多个 store 拆分,像后端模块一样划分领域模型。
🌍 Zustand 全局管理能管啥?
能管一切和 UI、逻辑有关的跨组件状态,比如:
- 用户信息、登录状态
- 页面 loading、toast 弹窗
- 左侧菜单是否展开
- 当前的路由 tab、筛选条件
- 数据缓存、接口请求状态
- 主题模式(light/dark)
甚至你可以配合 zustand/middleware 实现:
- 状态持久化(localStorage)
- devtools 调试
- 异步逻辑封装
- 状态监听 onChange
Zustand 是真·不仅轻,还不缺胳膊少腿。
UI 与状态的分层哲学
在中大型项目中,最理想的开发模式是:
UI(组件) = 纯函数 + props
业务状态 = 统一交给 store 管理
路由状态 = react-router-dom
React 本来就是声明式 UI,把状态解耦出来,UI 就能纯粹得像道数学题。
Zustand 和 Redux 对比一下?
| 特性 | Redux | Zustand |
|---|---|---|
| 是否需要 Provider | ✅ 必须 | ❌ 不需要 |
| 写法 | 函数 + 模板 | Hook 化自然写法 |
| 异步逻辑 | 需要 thunk/saga 等 | 直接支持 async 函数 |
| 状态更新粒度 | 组件级别更新 | 字段级别刷新 |
| 学习成本 | 高 | 低到不行 |
| TS 支持 | 非常好 | 非常好 |
如果 Redux 是个油腻大叔,Zustand 就像个有点酷的小青年,你喊它干活,它从来不抱怨,还总比你快一步。
✅ 总结
Zustand 是适合大多数中前端项目的状态管理工具。
- 小项目你可以不用它(用 useState 就行)
- 中大型项目建议直接上
- 它 Hook 化写法优雅,组件刷新精准,性能极佳
“组件是骨架,状态是灵魂,Zustand 是状态管理界的灵魂画手。”
你可以这样玩得更花:
- 加上 Zustand 的 persist 插件,状态刷页面都不丢
- 用 devtools 中间件直接和 Redux DevTools 一起用
- 搭配 React Router 组成状态 + 页面双中枢系统
如果你对 Zustand 的使用还不熟,欢迎收藏这篇文章、慢慢实践。如果你已经在项目中用起来了,也欢迎评论区分享你的用法 or 踩坑经历!