CommunityCodierung & Entwicklunggithub.com

jezweb/zustand-state-management

Erstelle typsichere globale Zustände in React mit Zustand. Unterstützt TypeScript, Persist-Middleware, Devtools, Slice-Pattern und Next.js SSR mit Hydrations-Handling. Verhindert 6 dokumentierte Fehler. Verwende es beim Einrichten von React-Status, Migration von Redux/Context oder bei der Fehlersuche bei Hydrationsfehlern, TypeScript-Inferenz, unendlichen Render-Schleifen oder Persist-Race-Conditions.

Was ist zustand-state-management?

Diese Skill-Anleitung (jezweb/zustand-state-management) beschreibt die Verwendung von Zustand zur Erstellung typsicherer globaler Zustände in React-Anwendungen. Sie richtet sich an Entwickler, die React-Status von Grund auf einrichten, von Redux oder Context migrieren oder häufig auftretende Probleme wie Hydrationsfehler in Next.js SSR, TypeScript-Inferenzprobleme, unendliche Render-Schleifen und Race Conditions bei der persist-Middleware beheben möchten. Die Anleitung unterstützt TypeScript, die persist-Middleware (mit localStorage/AsyncStorage), Devtools für Debugging, das Slice-Pattern zur Organisation komplexer Stores und die korrekte Handhabung von Hydration in Next.js SSR-Szenarien. Sie listet sechs dokumentierte Fehler auf und zeigt, wie diese vermieden werden können, einschließlich der richtigen Typannotation von create(), des Verzichts auf veraltete Methoden wie immer() aus Immer, der korrekten Verwendung von useShallow für Selektoren und der Adressierung von Hydrationsinkonsistenzen zwischen Server und Client.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/jezweb/claude-skills/tree/main/skills/zustand-state-management

Installed? Explore more Codierung & Entwicklung skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht zustand-state-management?

Erstelle typsichere globale Zustände in React mit Zustand. Unterstützt TypeScript, Persist-Middleware, Devtools, Slice-Pattern und Next.js SSR mit Hydrations-Handling. Verhindert 6 dokumentierte Fehler. Verwende es beim Einrichten von React-Status, Migration von Redux/Context oder bei der Fehlersuche bei Hydrationsfehlern, TypeScript-Inferenz, unendlichen Render-Schleifen oder Persist-Race-Conditions.

Einrichtung

npm install zustand

Typsicherer Basis-Store

import { create } from 'zustand'

interface BearStore {
  bears: number
  increase: () => void
  reset: () => void
}

export const useBearStore = create<BearStore>()((set) => ({
  bears: 0,
  increase: () => set((state) => ({ bears: state.bears + 1 })),
  reset: () => set({ bears: 0 }),
}))

Wichtig: Rufe create<T>() mit doppelten Klammern auf. Fehlt das leere () nach dem Generikum (create<T> statt create<T>()()), kann TypeScript den Rückgabetyp nicht korrekt ableiten und es entstehen unsichtbare Typfehler.

Verwendung in einer Komponente

function BearCounter() {
  const bears = useBearStore((state) => state.bears)
  return <h1>{bears} bears</h1>
}

function Controls() {
  const increase = useBearStore((state) => state.increase)
  return <button onClick={increase}>one up</button>
}

Selektoren sind wichtig: Indem du einen Selektor an useBearStore übergibst, verhinderst du unnötige Neurenderings. Wenn die Komponente nur bears benötigt, rendert sie auch nur neu, wenn sich bears ändert.

Persist-Middleware (localStorage / AsyncStorage)

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

interface BearStore {
  bears: number
  addBear: () => void
}

export const useBearStore = create<BearStore>()(
  persist(
    (set) => ({
      bears: 0,
      addBear: () => set((state) => ({ bears: state.bears + 1 })),
    }),
    {
      name: 'bear-storage',
    },
  ),
)

Hinweis: Bei Verwendung von Persist wird der Status beim ersten Laden aus dem Speicher wiederhergestellt. Der zurückgegebene Store hat eine _persist-Eigenschaft, mit der du den Wiederherstellungsstatus überwachen kannst.

Persist + Hydration in Next.js (SSR)

import { useEffect, useState } from 'react'

// Erstelle den Store wie oben mit persist

function HydratedBearCounter() {
  const [hydrated, setHydrated] = useState(false)

  useEffect(() => {
    setHydrated(true)
  }, [])

  // 🚫 Nicht direkt `useBearStore` aufrufen – das würde zu Hydrationsfehlern führen
  const bears = useBearStore((state) => state.bears)

  if (!hydrated) {
    return null // oder einen Lade-Platzhalter rendern
  }

  return <h1>{bears} bears</h1>
}

Warum: Bei SSR rendert der Server den initialen Status (0). Der Client rendert dann den persistenten Wert. Dies verursacht einen Hydrationsfehler. Die Lösung: Warte auf hydrated und rendere erst dann den persistenten Wert.

Devtools-Unterstützung

import { create } from 'zustand'
import { devtools } from 'zustand/middleware'

const useBearStore = create<BearStore>()(
  devtools(
    (set) => ({
      bears: 0,
      increase: () => set((state) => ({ bears: state.bears + 1 })),
    }),
    { name: 'bear-store' },
  ),
)

Erklärung: Devtools ermöglichen dir, alle Zustandsänderungen in den React DevTools (Browser-Erweiterung) zu verfolgen. Der optionale name-Parameter wird im Devtools-Panel als Label angezeigt.

Slice-Pattern (große Stores organisieren)

import { create } from 'zustand'

interface BearSlice {
  bears: number
  addBear: () => void
}

interface FishSlice {
  fishes: number
  addFish: () => void
}

// Erstelle die Slice-Funktionen separat

const createBearSlice: StateCreator<BearSlice & FishSlice, [], [], BearSlice> = (set) => ({
  bears: 0,
  addBear: () => set((state) => ({ bears: state.bears + 1 })),
})

const createFishSlice: StateCreator<BearSlice & FishSlice, [], [], FishSlice> = (set) => ({
  fishes: 0,
  addFish: () => set((state) => ({ fishes: state.fishes + 1 })),
})

// Kombiniere die Slices zu einem Store

export const useBoundStore = create<BearSlice & FishSlice>()((...a) => ({
  ...createBearSlice(...a),
  ...createFishSlice(...a),
}))

Vorteil: Wenn dein Store zu groß wird, kannst du ihn in logische Slices aufteilen. Jeder Slice kann in einer eigenen Datei gepflegt und in der Store-Zusammenstellung importiert werden.

6 dokumentierte Fehler

#FehlerUrsacheLösung
1Typrückschluss schlägt fehlcreate<T>() ohne leeres () verwendetImmer create<T>()() verwenden
2Hydrationsfehler in Next.jspersist-Store direkt in einer SSR-Komponente verwendetHydrationszustand mit _persist prüfen
3Unendliche Render-SchleifeAktualisierung von set in einem Effekt ohne AbhängigkeitenuseShallow oder stabilen Selektor verwenden
4Persist-Race-ConditionMehrere persist-Instanzen lesen/schreiben gleichzeitigpartialize verwenden oder merge konfigurieren
5TypeScript-Fehler beim Slice-PatternStateCreator hat falsche generische TypenDie richtige StateCreator<FullState, [], [], SliceType>-Syntax verwenden
6veraltetes immer-Middlewareimmer() wird als Middleware verwendet (vor v4.4)immer als transformer mit mutate verwenden oder produce direkt aufrufen

Auswahl der Middleware-Kombinationen

// Persist + Devtools + Immer (optional)
import { create } from 'zustand'
import { persist, devtools } from 'zustand/middleware'
import { immer } from 'zustand/middleware/immer'

const useBearStore = create<BearStore>()(
  devtools(
    persist(
      immer((set) => ({
        bears: 0,
        addBear: () => set((state) => { state.bears++ }), // direkte Mutation möglich
      })),
      { name: 'bear-storage' },
    ),
    { name: 'bear-store' },
  ),
)

Hinweis: Die Reihenfolge der Middlewares ist wichtig: Die äußerste Middleware wird zuerst aufgerufen. Typischerweise ist devtools die äußerste, dann persist, dann immer (oder keine).

Weitere bewährte Praktiken

  • Selektoren immer außerhalb der Komponente definieren, um Referenzgleichheit zu gewährleisten.
  • useShallow verwenden, wenn du mehrere Werte aus dem Store benötigst.
  • Keine asynchronen Aktionen in set verwenden – rufe set innerhalb eines asynchronen Blocks auf.
  • TypeScript: Den Store generieren, nicht den useStore-Hook – exportiere den gesamten create()-Aufruf.

Referenzen

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

jezweb/ai-image-generator

Generate AI images using Gemini or GPT APIs directly. Covers model selection (Gemini for scenes; GPT Image 2 for text rendering, batch variations, multi-reference compositing; GPT Image 1.5 for transparent icons), the 5-part prompting framework, API calling patterns, multi-turn editing, and quality assurance. Produces photorealistic scenes, icons, illustrations, OG images, posters, infographics, and product shots. Use when building websites that need images, creating marketing assets, or generating visual content. Triggers: 'generate image', 'ai image', 'create hero image', 'make an icon', 'generate illustration', 'create og image', 'poster', 'infographic', 'image variations', 'gpt-image-2', 'ai art', 'image generation'.

jezweb/aussie-business-english

Australian business English writing style for professional communications — warm, direct, EN-AU spelling (colour, organise, centre). Use whenever the user is writing for an Australian audience: emails, chat messages, proposals, client communications, blog posts, web copy, or any business writing. Apply to drafting, editing, and tone-checking professional text.

jezweb/claude-skills

Generate project documentation from codebase analysis — ARCHITECTURE.md, API_ENDPOINTS.md, DATABASE_SCHEMA.md. Reads source code, schema files, routes, and config to produce accurate, structured docs. Use when starting a project, onboarding contributors, or when docs are missing or stale. Triggers: 'generate docs', 'document architecture', 'create api docs', 'document schema', 'project documentation', 'write architecture doc'.

jezweb/claude-skills

Agent skill at plugins/social-media/skills/social-media-posts/SKILL.md

jezweb/claude-skills

Generate a complete, deployable landing page from a brief. Produces a single self-contained HTML file with Tailwind CSS (via CDN), responsive design, dark mode, semantic HTML, and OG meta tags. Sections: hero with CTA, features, social proof, pricing (optional), FAQ, footer. Use when building a marketing page, product launch page, coming soon page, or any standalone landing page. Triggers: 'landing page', 'create a page', 'marketing page', 'launch page', 'coming soon page', 'one-page site'.

jezweb/cloudflare-worker-builder

Scaffold and deploy Cloudflare Workers with Hono routing, Vite plugin, and Static Assets. Describe project, scaffold structure, configure bindings, deploy. Use whenever the user wants to create a Worker project, set up Hono on Cloudflare, configure D1 / R2 / KV / Queues bindings, or troubleshoot Worker export syntax, API route conflicts, HMR issues, or deployment failures.

jezweb/color-palette

Generate complete, accessible colour palettes from a single brand hex. Produces 11-shade scale (50-950), semantic tokens, dark mode variants, Tailwind v4 CSS output, WCAG contrast checks. Use whenever the user supplies a brand hex and asks for a palette, mentions setting up a design system, wants Tailwind theme colours from a brand colour, or asks to check colour accessibility / contrast.

jezweb/d1-drizzle-schema

Generate Drizzle ORM schemas for Cloudflare D1 databases with correct D1-specific patterns. Produces schema files, migration commands, type exports, and DATABASE_SCHEMA.md documentation. Handles D1 quirks: foreign keys always enforced, no native BOOLEAN/DATETIME types, 100 bound parameter limit, JSON stored as TEXT. Use when creating a new database, adding tables, or scaffolding a D1 data layer.

jezweb/elevenlabs-agents

Build conversational AI voice agents on the ElevenLabs platform. Configure agent + tools + knowledge base, integrate SDK (React / React Native / Swift / JS / server-side), test, deploy. Use whenever the user mentions ElevenLabs, building a voice agent, an AI phone system, an AI receptionist, conversational AI, or troubleshooting deprecated @11labs packages, webhook errors, CSP violations, localhost allowlist, or tool parsing errors.

jezweb/fastapi

Build Python APIs with FastAPI, Pydantic v2, and SQLAlchemy 2.0 async. Covers project structure, JWT auth, validation, and database integration with uv package manager. Prevents 7 documented errors. Use when: creating Python APIs, implementing JWT auth, or troubleshooting 422 validation, CORS, async blocking, form data, background tasks, or OpenAPI schema errors.

jezweb/favicon-gen

Generate custom favicons from logos, text, or brand colours. Produces favicon.svg, favicon.ico, apple-touch-icon.png, icon-192/512.png, and web manifest. Use whenever the user wants a favicon, mentions replacing a CMS default favicon, converting a logo into a favicon, creating branded initials icons, or troubleshooting favicon not displaying / iOS black square / missing manifest.

jezweb/github-release

Prepare and publish GitHub releases. Sanitizes code for public release (secrets scan, personal artifacts, LICENSE/README validation), creates version tags, and publishes via gh CLI. Trigger with 'release', 'publish', 'open source', 'prepare for release', 'create release', or 'github release'.

jezweb/google-apps-script

Build Google Apps Script automation for Sheets and Workspace. Custom menus, triggers (onEdit / time-driven / form submit), dialogs, sidebars, email batches, PDF export, external API. Use whenever the user wants to automate a Google Sheet, build a Sheets menu / sidebar / dialog, hit a Sheets row from email or a webhook, schedule a Sheets workflow, or asks 'how do I script this in Sheets'.

jezweb/google-chat-messages

Send Google Chat messages via incoming webhooks — text, rich cards (cardsV2), threaded replies. TypeScript types, card builder utility, widget reference inline. Use whenever the user wants to post to Google Chat from a script, build a chatbot reply, send a notification card, build a Google Chat webhook integration, or troubleshoot card / threading issues.

jezweb/hono-api-scaffolder

Scaffold Hono API routes for Cloudflare Workers. Produces route files, middleware, typed bindings, Zod validation, error handling, and API_ENDPOINTS.md documentation. Use after a project is set up with cloudflare-worker-builder or vite-flare-starter, when you need to add API routes, create endpoints, or generate API documentation.

jezweb/icon-set-generator

Generate cohesive, project-specific SVG icon sets for websites and applications. Use this skill whenever the user needs custom icons, an icon set for a website or app, icons for a client project, or mentions needing SVG icons that look consistent together. Also trigger when the user describes a project and icons would naturally be part of the deliverable — e.g. 'I'm building a site for a plumber' implies they'll need service icons. Trigger on: 'icons for', 'icon set', 'custom icons', 'SVG icons', 'make me icons', 'I need icons', 'website icons', 'project icons', or any request for consistent visual assets for a web project. Produces individual SVG files with a consistent style engine, not generic icon library lookups.

jezweb/image-processing

Process images for web development — resize, crop, trim whitespace, convert formats (PNG/WebP/JPG), optimise file size, generate thumbnails, create OG card images. Uses Pillow (Python) — no ImageMagick needed. Trigger with 'resize image', 'convert to webp', 'trim logo', 'optimise images', 'make thumbnail', 'create OG image', 'crop whitespace', 'process image', or 'image too large'.

jezweb/mcp-builder

Build MCP servers in Python with FastMCP. Define tools / resources / prompts, build the server, test locally, deploy to FastMCP Cloud or Docker. Use whenever the user mentions building an MCP server, exposing tools to LLMs, FastMCP, building a Claude integration, or troubleshooting FastMCP module-level server, storage, lifespan, middleware, OAuth, or deployment errors.

jezweb/nextjs

Build Next.js 16 apps with App Router, Server Components/Actions, Cache Components ("use cache"), and async route params. Includes proxy.ts and React 19.2. Prevents 25 documented errors. Use when: building Next.js 16 projects, or troubleshooting async params (Promise types), "use cache" directives, parallel route 404s, Turbopack issues, i18n caching, navigation throttling.

jezweb/project-health

All-in-one project configuration and health management. Sets up new projects (settings.local.json, CLAUDE.md, .gitignore), audits existing projects (permissions, context quality, MCP coverage, leaked secrets, stale docs), tidies accumulated cruft, captures session learnings, and adds permission presets. Uses sub-agents for heavy analysis to keep main context clean. Trigger with 'project health', 'check project', 'setup project', 'kickoff', 'bootstrap', 'tidy permissions', 'clean settings', 'capture learnings', 'audit context', 'add python permissions', or 'init project'.

Verwandte Skills