Zustand状态管理技能Skill zustand

Zustand状态管理技能是一个专门用于实现React应用轻量级全局状态管理的专家系统。它提供Zustand库的完整实现方案,包括类型安全的存储创建、中间件集成(持久化、DevTools、Immer)、模块化切片设计、性能优化选择器、异步操作处理等核心功能。适用于前端开发、状态管理迁移、性能优化等场景,关键词包括:Zustand状态管理、React全局状态、TypeScript类型安全、状态持久化、性能优化选择器、模块化切片、中间件集成、前端开发工具。

前端开发 0 次安装 4 次浏览 更新于 2/26/2026

名称: zustand 描述: 包含Zustand状态管理模式的实现,包括存储创建、中间件、持久化、切片以及DevTools集成。 允许工具: 读取、写入、编辑、Bash、Glob、Grep

Zustand 技能

为使用现代模式和TypeScript实现Zustand状态管理提供专家级协助。

能力

  • 创建类型安全的Zustand存储
  • 实现中间件(持久化、devtools、immer)
  • 设计存储切片以实现模块化状态
  • 优化选择器以提高性能
  • 处理异步操作和订阅
  • 高效集成到React组件中

使用场景

在以下情况时调用此技能:

  • 设置轻量级全局状态
  • 创建具有持久化功能的存储
  • 使用切片实现复杂状态
  • 使用选择器优化组件重新渲染
  • 从Redux或Context迁移

输入参数

参数 类型 是否必需 描述
storeName 字符串 存储的名称
stateShape 对象 初始状态结构
actions 数组 要创建的存储操作
middleware 数组 要应用的中间件
persist 布尔值 启用持久化

配置示例

{
  "storeName": "useCartStore",
  "stateShape": {
    "items": [],
    "total": 0
  },
  "actions": ["addItem", "removeItem", "clearCart"],
  "middleware": ["devtools", "persist"],
  "persist": true
}

生成的模式

基础存储

import { create } from 'zustand';

interface CartItem {
  id: string;
  name: string;
  price: number;
  quantity: number;
}

interface CartStore {
  items: CartItem[];
  total: number;
  addItem: (item: Omit<CartItem, 'quantity'>) => void;
  removeItem: (id: string) => void;
  updateQuantity: (id: string, quantity: number) => void;
  clearCart: () => void;
}

export const useCartStore = create<CartStore>((set, get) => ({
  items: [],
  total: 0,

  addItem: (item) =>
    set((state) => {
      const existingItem = state.items.find((i) => i.id === item.id);
      if (existingItem) {
        return {
          items: state.items.map((i) =>
            i.id === item.id ? { ...i, quantity: i.quantity + 1 } : i
          ),
          total: state.total + item.price,
        };
      }
      return {
        items: [...state.items, { ...item, quantity: 1 }],
        total: state.total + item.price,
      };
    }),

  removeItem: (id) =>
    set((state) => {
      const item = state.items.find((i) => i.id === id);
      return {
        items: state.items.filter((i) => i.id !== id),
        total: state.total - (item ? item.price * item.quantity : 0),
      };
    }),

  updateQuantity: (id, quantity) =>
    set((state) => {
      const item = state.items.find((i) => i.id === id);
      if (!item) return state;
      const diff = (quantity - item.quantity) * item.price;
      return {
        items: state.items.map((i) =>
          i.id === id ? { ...i, quantity } : i
        ),
        total: state.total + diff,
      };
    }),

  clearCart: () => set({ items: [], total: 0 }),
}));

带中间件的存储

import { create } from 'zustand';
import { devtools, persist, subscribeWithSelector } from 'zustand/middleware';
import { immer } from 'zustand/middleware/immer';

interface UserStore {
  user: User | null;
  preferences: Preferences;
  setUser: (user: User) => void;
  updatePreferences: (prefs: Partial<Preferences>) => void;
  logout: () => void;
}

export const useUserStore = create<UserStore>()(
  devtools(
    persist(
      subscribeWithSelector(
        immer((set) => ({
          user: null,
          preferences: { theme: 'light', notifications: true },

          setUser: (user) =>
            set((state) => {
              state.user = user;
            }),

          updatePreferences: (prefs) =>
            set((state) => {
              Object.assign(state.preferences, prefs);
            }),

          logout: () =>
            set((state) => {
              state.user = null;
            }),
        }))
      ),
      {
        name: 'user-storage',
        partialize: (state) => ({ preferences: state.preferences }),
      }
    ),
    { name: 'UserStore' }
  )
);

切片模式

import { create, StateCreator } from 'zustand';

interface AuthSlice {
  isAuthenticated: boolean;
  token: string | null;
  login: (token: string) => void;
  logout: () => void;
}

interface UISlice {
  sidebarOpen: boolean;
  theme: 'light' | 'dark';
  toggleSidebar: () => void;
  setTheme: (theme: 'light' | 'dark') => void;
}

type StoreState = AuthSlice & UISlice;

const createAuthSlice: StateCreator<StoreState, [], [], AuthSlice> = (set) => ({
  isAuthenticated: false,
  token: null,
  login: (token) => set({ isAuthenticated: true, token }),
  logout: () => set({ isAuthenticated: false, token: null }),
});

const createUISlice: StateCreator<StoreState, [], [], UISlice> = (set) => ({
  sidebarOpen: true,
  theme: 'light',
  toggleSidebar: () => set((state) => ({ sidebarOpen: !state.sidebarOpen })),
  setTheme: (theme) => set({ theme }),
});

export const useAppStore = create<StoreState>()((...a) => ({
  ...createAuthSlice(...a),
  ...createUISlice(...a),
}));

异步操作

import { create } from 'zustand';

interface DataStore {
  data: Item[];
  loading: boolean;
  error: string | null;
  fetchData: () => Promise<void>;
}

export const useDataStore = create<DataStore>((set, get) => ({
  data: [],
  loading: false,
  error: null,

  fetchData: async () => {
    set({ loading: true, error: null });
    try {
      const response = await fetch('/api/data');
      const data = await response.json();
      set({ data, loading: false });
    } catch (error) {
      set({ error: (error as Error).message, loading: false });
    }
  },
}));

选择器模式

// 对象选择器的浅比较
import { shallow } from 'zustand/shallow';

const { items, total } = useCartStore(
  (state) => ({ items: state.items, total: state.total }),
  shallow
);

// 计算选择器
const itemCount = useCartStore((state) =>
  state.items.reduce((sum, item) => sum + item.quantity, 0)
);

最佳实践

  • 使用选择器最小化重新渲染
  • 对需要刷新后保留的状态应用持久化中间件
  • 使用immer处理复杂的嵌套更新
  • 将大型存储拆分为切片
  • 保持操作与状态放在一起

目标流程

  • react应用开发
  • 状态管理设置
  • nextjs全栈开发
  • t3栈开发