正在加载,请稍候…

Zustand:无需 Provider 的最小化 React 状态管理

学习 Zustand——store、actions、immer 集成、持久化、devtools 以及用于可扩展全局状态的 slices 模式。

Zustand:无需 Provider 的最小化 React 状态管理

Zustand:Store 就是一个 Hook

1.2KB,无 provider,无样板代码。

import { create } from 'zustand'

export const useCartStore = create((set) => ({
  items: [],
  total: 0,
  addItem: (product, qty) => set((state) => {
    const existing = state.items.find(i => i.id === product.id)
    const items = existing
      ? state.items.map(i => i.id === product.id ? { ...i, qty: i.qty + qty } : i)
      : [...state.items, { ...product, qty }]
    return { items, total: items.reduce((s, i) => s + i.price * i.qty, 0) }
  }),
  clearCart: () => set({ items: [], total: 0 }),
}))

Zustand:无需 Provider 的最小化 React 状态管理插图

细粒度选择器

const count = useCartStore(state => state.items.length) // 仅在 count 变化时重新渲染
const { clearCart } = useCartStore()                    // 稳定引用

Zustand:无需 Provider 的最小化 React 状态管理插图

Immer + 持久化

import { create } from 'zustand'
import { immer } from 'zustand/middleware/immer'
import { persist } from 'zustand/middleware'

const useStore = create(persist(immer((set) => ({
  todos: [],
  addTodo: (text) => set(state => { state.todos.push({ id: Date.now(), text, done: false }) }),
})), { name: 'app-state' }))

Zustand:无需 Provider 的最小化 React 状态管理插图

Slices 模式

const createAuth = (set) => ({
  user: null,
  login: async (creds) => { const user = await auth(creds); set({ user }) },
  logout: () => set({ user: null }),
})

export const useStore = create((...args) => ({ ...createAuth(...args) }))

-> 使用 JSON Viewer 调试 store 状态。