什么是 zustand?
zustand(德语中的”state”)是一个小型、快速且可扩展的状态管理库,适用于 React 应用。由 Poimandres 团队开发,zustand 以其极简的 API 和无需包装器组件的设计理念受到开发者的喜爱。与 Redux、MobX 等传统状态管理库相比,zustand 提供了更加直观和简洁的开发体验。
zustand 的核心理念是提供最小化的 API,让开发者专注于业务逻辑而非复杂的配置。它支持中间件、SSR、Typescript,并且包体积只有2KB 左右,是现代 React 应用状态管理的理想选择之一。
zustand 的主要特点
- 极简 API: 不需要 Provider 包装,也不需要复杂的配置
- 无模板代码: 相比 Redux 的 action/type/reducer 模式,zustand 几乎没有任何模板代码
- 性能优异: 使用原生 ES6 Proxy 进行变更检测,避免不必要的渲染
- Typescript 友好: 提供完整的 Typescript 支持
- 中间件支持: 支持日志记录、持久化、时间旅行等高级功能
安装和基本使用
安装 zustand
1 | # 使用 npm |
创建第一个 store
1 | // stores/useStore.JS |
在组件中使用
1 | // components/Counter.jsx |
核心概念详解
State(状态)
状态是 store 中最基本的概念。在 zustand 中,状态是普通 Javascript 对象的一个属性。你可以存储任何类型的数据,包括原始值、对象、数组和函数。
1 | // 复杂状态示例 const useAppStore = create(set => ({ |
Set(状态更新)
set函数用于更新 store 中的状态。它可以接受一个对象或一个函数。当传入函数时,该函数接收当前状态作为参数,返回要更新的状态部分。
1 | const useCounterStore = create(set => ({ |
Get(状态获取)
get函数允许你在更新状态时访问当前状态,避免闭包问题。它通常在需要基于当前状态计算新状态时使用。
1 | const useTodoStore = create((set, get) => ({ |
高级用法
分离状态和动作
1 | // stores/todoStore.JS |
计算属性
1 | import { create } from 'zustand'; |
中间件使用
日志中间件
1 | import { create } from 'zustand'; |
持久化中间件
1 | import { create } from 'zustand'; |
自定义中间件
1 | // 自定义节流中间件 const throttle = (config, delay = 1000) => (set, get, API) => { |
与其它状态管理库的对比
zustand vs Redux
| 特性 | zustand | Redux |
|---|---|---|
| 安装包大小 | ~2KB | ~2.5KB (core) + middleware |
| 设置复杂度 | 极简 | 需要 configureStore 等配置 |
| 模板代码 | 几乎没有 | 需要 actions/types/reducers |
| React 集成 | 无需 Provider | 需要 Provider 包装 |
| Typescript 支持 | 优秀 | 需要额外配置 |
1 | // zustand |
zustand vs Context API
1 | // Context API 需要 Provider 包装 |
实际应用场景
用户认证状态管理
1 | // stores/authStore.JS |
购物车状态管理
1 | // stores/cartStore.JS |
性能优化技巧
Selectors 优化
1 | import { create } from 'zustand'; |
避免不必要的重渲染
1 | import { shallow } from 'zustand/shallow'; |
分离高频更新状态
1 | // 将频繁变化的状态分离到独立的 store 中 const useUIStore = create(set => ({ |
最佳实践
1. 合理划分 store
1 | // 好的做法:按功能模块划分 store |
2. 类型定义(Typescript)
1 | interface User { |
3. 错误处理
1 | const useErrorStore = create(set => ({ |
4. 状态初始化
1 | // 在应用启动时初始化状态 import { useAuthStore } from './stores/authStore'; |
测试 zustand store
1 | // __tests__/counterStore.test.JS |
总结
- zustand 提供了极简的 API 和优秀的开发体验
- 无需 Provider 包装,降低了组件树的复杂性
- 支持中间件,可以轻松添加日志、持久化等功能
- 与 React 生态完美集成,Typescript 支持完善
- 适合中小型项目的状态管理需求
- 对于大型复杂应用,仍需考虑其他方案的权衡
用 zustand 重构完项目后,感觉整个代码清爽了不少。再也不用写那些冗长的 action creators 了,代码量减少了近30%,维护起来也方便多了。有时候技术选型真的很重要,选择合适的工具能让开发变得愉快许多!
扩展阅读
- Zustand 官方文档
- React 状态管理最佳实践
- 现代 React 状态管理对比
- Typescript 与状态管理
参考资料
- Zustand GitHub Repository: https://github.com/pmndrs/zustand
- React Documentation: https://reactjs.org/
- State Management Patterns in React: https://frontendmasters.com/guides/redux-book/
