梗概
Zustand是一个轻量级的React状态管理库,相比Redux更简单直观,支持原生异步处理,使用浅合并进行状态更新。
特点
- 相比redux更简单,没有那么多复杂概念
- 支持原生异步处理,可以直接使用async/await
- 默认使用浅合并更新状态(等同于
{...state, targetProp: value}) - 轻量级,bundle size小
注意事项
- 浅合并特性意味着更新嵌套对象时需要手动处理深层更新
- 如果需要深合并,需要自己实现或使用第三方工具如immer
进阶用法
1. 处理嵌套对象更新
由于set函数默认是浅合并,在更新嵌套对象时,必须手动展开旧状态,否则会丢失未修改的属性。
// 假如原state中user:{age: 24, name:tom}
// ❌ 错误:会删除user.name
set({ user: { age: 31 } })
// 结果:{ user: { age: 31 } } (name 丢失!)
// ✅ 正确:展开原有属性
set(state => ({
user: { ...state.user, age: 31 }
}))2. 使用 Immer 中间件
为了简化嵌套对象的更新,可以引入immer中间件。它允许你像直接修改(mutable)对象一样更新状态,而无需担心不可变性。
import { create } from 'zustand'
import { immer } from 'zustand/middleware/immer'
const useStore = create(immer((set) => ({
user: { name: "Bob", age: 30 },
updateName: (name) => set(state => {
state.user.name = name // ✅ 直接修改!
}),
updateAge: () => set(state => {
state.user.age = 40 // ✅ 直接修改!
})
})))