Back to roadmaps zustand Course

Zustand Common API Cheat Sheet

This quick reference guide summarizes the most common patterns and configurations in Zustand.


1. Creating a Basic Store

import { create } from "zustand";

interface State {
  count: number;
  increment: () => void;
}

export const useStore = create<State>((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
}));

2. Immutable Array Modifications

// A. Appending an item to list
addItem: (newItem) => set((state) => ({
  items: [...state.items, newItem]
})),

// B. Filtering / Deleting an item
removeItem: (itemId) => set((state) => ({
  items: state.items.filter((item) => item.id !== itemId)
})),

// C. Updating an item properties
updateItem: (itemId, newFields) => set((state) => ({
  items: state.items.map((item) =>
    item.id === itemId ? { ...item, ...newFields } : item
  )
})),

3. Configuring Persist and DevTools Middlewares

import { create } from "zustand";
import { persist, devtools } from "zustand/middleware";

interface SettingsStore {
  theme: string;
  setTheme: (theme: string) => void;
}

// Curried format () before devtools call is mandatory for correct TS inference
export const useSettings = create<SettingsStore>()(
  devtools(
    persist(
      (set) => ({
        theme: "light",
        setTheme: (theme) => set({ theme }, false, "settings/setTheme"),
      }),
      {
        name: "user-settings-storage", // localStorage Key
      }
    )
  )
);

4. Subscribing to Store Updates

import { useStore } from "./store";

// Listen to all changes in the store from outside React component
const unsubscribe = useStore.subscribe((state, previousState) => {
  console.log("Count changed to:", state.count);
});

// Clean up listener
// unsubscribe();
Published on Last updated: