Status: Akzeptiert Datum: 2025-12-17 Entscheider: Architektur-Team

Kontext

Neben Server-State (TanStack Query) benötigen wir lokales State Management für UI-State wie Formulareingaben, Modal-Zustände, Filteroptionen und temporäre Daten.

Entscheidung

Wir verwenden Zustand als minimale State Management Library für lokalen UI-State.

Begründung

Vorteile

  • Minimale API - Extrem einfach zu lernen
  • Keine Boilerplate - Kein Redux-ähnliches Setup erforderlich
  • Hooks-basiert - Natürliche React-Integration
  • TypeScript-First - Exzellente Type-Inferenz
  • Kleine Bundle-Size - Nur ~1KB gzipped
  • DevTools - Redux DevTools kompatibel
  • Middleware - Persist, Immer, DevTools integrierbar

Alternativen

Alternative Grund für Ablehnung
Redux Toolkit Zu viel Overhead für UI-State
Jotai Atomic Approach nicht benötigt
Recoil Komplexer, Meta-Abhängigkeit
Context API Performance-Probleme bei häufigen Updates
useState only Nicht skalierbar für komplexere Zustände

Konsequenzen

Positiv

  • Sehr einfache Lernkurve für Team
  • Minimaler Overhead im Bundle
  • Klare Trennung: Zustand = UI-State, TanStack Query = Server-State
  • Schnelle Entwicklungsgeschwindigkeit

Negativ

  • Nicht geeignet für komplexe State-Maschinen (aktuell nicht benötigt)
  • Bei sehr großen State-Trees weniger strukturiert als Redux

Technische Details

// Store Definition
import { create } from 'zustand';
import { persist } from 'zustand/middleware';

interface UIState {
  sidebarOpen: boolean;
  filterOptions: FilterOptions;
  toggleSidebar: () => void;
  setFilter: (options: FilterOptions) => void;
}

export const useUIStore = create<UIState>()(
  persist(
    (set) => ({
      sidebarOpen: true,
      filterOptions: {},
      toggleSidebar: () => set((state) => ({
        sidebarOpen: !state.sidebarOpen
      })),
      setFilter: (options) => set({ filterOptions: options }),
    }),
    {
      name: 'ui-storage', // LocalStorage key
    }
  )
);

// Usage
const { sidebarOpen, toggleSidebar } = useUIStore();

Dependencies:

{
  "zustand": "^4.4.0"
}

State-Architektur

  • Server-State → TanStack Query (cached, synchronized)
  • UI-State → Zustand (local, ephemeral or persisted)
  • Form-State → React Hook Form (component-local)