Magento 2 Experten — Hyvä Theme, Tailwind CSS & SEO aus einer Hand ›

Eine Task als erledigt markieren

Eine Task als erledigt markieren

~12 Min. Lesezeit Zuletzt aktualisiert am 8. August 2026

Der HÄUFIGSTE Interaktion in JEDEM Task-Manager: EIN Klick, um done umzuschalten – EIN GUTES Beispiel für eine Mutation OHNE eigenes Formular.

Den Toggle-Hook

src/hooks/useToggleTaskDone.ts
import { useMutation, useQueryClient } from '@tanstack/react-query';
import { apiClient } from '../api/client';
import type { Task } from '../types/task';

interface ToggleTaskInput {
  taskId: number;
  done: boolean;
  projectId: number;
}

export function useToggleTaskDone() {
  const queryClient = useQueryClient();

  return useMutation({
    mutationFn: async ({ taskId, done }: ToggleTaskInput) => {
      const response = await apiClient.patch<Task>(
        `/tasks/${taskId}`,
        { done },
        { headers: { 'Content-Type': 'application/merge-patch+json' } },
      );

      return response.data;
    },
    onSuccess: (_data, variables) => {
      queryClient.invalidateQueries({
        queryKey: ['projects', variables.projectId, 'tasks'],
      });
    },
  });
}

Das Checkbox-Element

function TaskItem({ task, projectId }: { task: Task; projectId: number }) {
  const toggleDone = useToggleTaskDone();

  return (
    <li>
      <input
        type="checkbox"
        checked={task.done}
        disabled={toggleDone.isPending}
        onChange={(e) =>
          toggleDone.mutate({
            taskId: task.id,
            done: e.target.checked,
            projectId,
          })
        }
      />
      {task.title}
    </li>
  );
}

checked={task.done} macht die Checkbox zu einer KONTROLLIERTEN React-Komponente – der ANGEZEIGTE Zustand kommt IMMER aus dem TanStack-Query-Cache, NIEMALS aus einem lokalen useState.

Achtung: OHNE disabled={toggleDone.isPending} könnte ein SCHNELLES Doppelklicken ZWEI überlappende Requests auslösen – bei EINEM einfachen Boolean-Toggle ist das FOLGENLOS (Server-Zustand landet AUF DEM zuletzt GESENDETEN Wert), bei KOMPLEXEREN Mutationen (z. B. Inkrementieren) könnte es zu INKONSISTENTEM Verhalten führen.

Warum kein optimistic update hier (noch)

EIN sofortiges visuelles Feedback (BEVOR die Server-Antwort eintrifft) wäre GERADE bei DIESER Interaktion WÜNSCHENSWERT – Kapitel 91 rüstet DIESEN Hook GEZIELT mit "optimistic updates" NACH, NACHDEM das GRUNDPRINZIP hier OHNE die zusätzliche Komplexität etabliert wurde.

Tipp: Mercure (Kapitel 82) ließe sich AUCH auf Task aktivieren (Kapitel-72-Übung) – dann würde ein Toggle in EINEM Tab AUCH in JEDEM anderen geöffneten Tab SOFORT sichtbar, GENAU wie beim archived-Status aus Kapitel 85.