Zustand ist schon in der Basis-Version ein elegantes State-Management-Tool. Aber erst die Middleware-API macht es wirklich produktionstauglich: persist synchronisiert den State mit localStorage, devtools öffnet das Redux DevTools-Panel, immer erlaubt direkte Mutations statt verschachtelter Spreads, und subscribeWithSelector ermöglicht granulare Reaktionen auf Slice-Änderungen. Claude Code kennt alle diese Patterns – dieses Tutorial zeigt dir, wie du sie gemeinsam mit dem KI-Coding-Assistenten professionell einsetzt.
persist 1. persist Middleware – State in localStorage speichern
Warum persist?
Ohne Persistenz verliert deine App bei jedem Reload den kompletten Store-Inhalt.
Die persist-Middleware von Zustand serialisiert den State automatisch
in einen konfigurierbaren Storage-Backend (localStorage, sessionStorage, IndexedDB oder
eigene Adapter) und rehydriert ihn beim nächsten App-Start.
Claude Code versteht dabei nicht nur die API – es schlägt dir direkt vor, welche State-Slices du persistieren solltest und welche besser im flüchtigen Arbeitsspeicher bleiben (z. B. UI-Flags oder temporäre Ladestatuse).
Minimale persist-Konfiguration
Nur bestimmte Felder persistieren mit partialize
Oft willst du nicht den gesamten Store speichern – UI-Status, temporäre Fehler oder
Ladezustände gehören nicht in localStorage. Mit partialize gibst du exakt
an, welche State-Teile serialisiert werden:
Migrations und Rehydrierung mit onRehydrateStorage
Wenn sich das State-Schema zwischen App-Versionen ändert, brauchst du Migrationspfade.
Claude Code hilft dir, versionierte Schemas zu schreiben und mit onRehydrateStorage
sauber zu reagieren, sobald der alte State aus localStorage geladen wird:
createJSONStorage(() => localStorage)
lazy evaluieren oder auf sessionStorage mit Server-Side-Fallback ausweichen.
devtools 2. devtools Middleware – Redux DevTools Integration
Redux DevTools mit Zustand nutzen
Die devtools-Middleware verbindet deinen Zustand-Store mit den Redux DevTools
Browser-Extensions. Du bekommst damit Time-Travel Debugging, Action-History und
State-Snapshots – ohne ein einziges Redux-Package installieren zu müssen.
Claude Code fĂĽgt die Middleware automatisch ein und benennt Aktionen nach deinen Store-Methoden, sodass das DevTools-Panel sofort lesbare Action-Namen zeigt.
devtools aktivieren
Time-Travel Debugging in der Praxis
Mit den Redux DevTools kannst du jeden vergangenen State-Snapshot anspringen. Klicke auf eine Action in der History-Liste und die gesamte UI rendert in den damaligen Zustand – ohne die App neu zu laden. Für komplexe Warenkorb-Logiken oder Wizard-Flows ist das unschätzbar wertvoll.
Claude Code hilft dir auĂźerdem, den dritten Parameter von set() konsequent zu
befüllen. Der KI-Assistent schlägt dabei eine einheitliche Namenskonvention vor
(sliceName/actionName), die in der DevTools-History sofort verständlich ist.
enabled: process.env.NODE_ENV !== 'production',
damit die DevTools-Anbindung im Production-Build vollständig entfernt wird. Tree-Shaking
eliminiert dann den gesamten DevTools-Overhead.
immer 3. immer Middleware – Mutations statt Spreads
Das Problem mit tief verschachteltem State
Sobald dein Store verschachtelte Objekte enthält, wird immutables Updaten mit dem
Spread-Operator mühsam und fehleranfällig. Statt
{ ...state, user: { ...state.user, address: { ...state.user.address, zip: '10115' }}}
schreibst du mit Immer einfach: state.user.address.zip = '10115'.
Die immer-Middleware von Zustand integriert Immer.js direkt in den
set-Aufruf. Claude Code erkennt verschachtelte State-Strukturen und schlägt
die Immer-Migration automatisch vor.
immer installieren und konfigurieren
subscribeWithSelector 4. subscribeWithSelector – granulare Store-Subscriptions
Warum subscribeWithSelector?
Die Standard-subscribe()-API von Zustand reagiert auf jede
State-Änderung. Mit subscribeWithSelector kannst du einen Selector-Funktion
angeben und erhältst nur dann einen Callback, wenn sich der selektierte Wert tatsächlich
geändert hat – vergleichbar mit useSelector in Redux.
Das ist besonders nĂĽtzlich fĂĽr Seiteneffekte auĂźerhalb von React-Komponenten: Analytics-Tracking, WebSocket-Synchronisation oder lokale Cache-Invalidierung.
subscribeWithSelector aktivieren und Watcher implementieren
subscribeWithSelector in Komponenten nutzen
Innerhalb von Komponenten bleibt useSessionStore(selector) der bevorzugte
Weg. Die .subscribe()-API ist fĂĽr Seiteneffekte auĂźerhalb des React-Lifecycles
gedacht. Claude Code macht diesen Unterschied explizit und kommentiert es entsprechend.
combine 5. combine – mehrere Stores zusammenführen
Was macht combine?
combine ist ein Helfer (kein vollwertiges Middleware), der Initial-State und
Creator-Funktion zusammenfĂĽhrt und dabei automatisch TypeScript-Typen ableitet. Du musst
das Interface nicht mehr manuell definieren – TypeScript inferiert es aus dem initialen
State-Objekt.
combine mit TypeScript-Inferenz
Chains 6. Middleware kombinieren – Reihenfolge und TypeScript
Die richtige Middleware-Reihenfolge
Wenn du mehrere Middlewares kombinierst, ist die Reihenfolge entscheidend. Zustand verarbeitet Middlewares von auĂźen nach innen. Folgende Reihenfolge hat sich als Best Practice etabliert:
| Position | Middleware | BegrĂĽndung |
|---|---|---|
| 1 (auĂźen) | devtools |
Muss alle State-Änderungen sehen – muss außen sein |
| 2 | persist |
Persistiert nach devtools, vor Immer-Mutations |
| 3 | subscribeWithSelector |
Subscriptions greifen auf persistierten State zu |
| 4 (innen) | immer |
Konvertiert Mutations in immutable Updates |
Alle Middlewares kombiniert – Production-Setup
TypeScript-Typen beim Kombinieren
Bei kombinierten Middlewares kann TypeScript manchmal Schwierigkeiten mit der Typ-Inferenz haben. Claude Code kennt das Muster und schreibt automatisch den korrekten Generic-Aufruf:
Quick Reference – alle Middlewares auf einen Blick
| Middleware | Import-Pfad | Hauptzweck | Install |
|---|---|---|---|
| persist | zustand/middleware |
localStorage / sessionStorage Sync | – |
| devtools | zustand/middleware |
Redux DevTools, Time-Travel | – |
| immer | zustand/middleware/immer |
Mutation-basierte Updates | npm i immer |
| subscribeWithSelector | zustand/middleware |
Granulare Subscriptions | – |
| combine | zustand/middleware |
Typ-Inferenz ohne Interface | – |
Zustand-Middleware mit KI-UnterstĂĽtzung meistern
Starte deinen kostenlosen Trial und lass Claude Code deine Zustand-Stores mit der passenden Middleware-Chain generieren – von persist bis Immer, typsicher und produktionsfertig.
Kostenlos starten →