S SvelteKurs
M3 · Props & Kommunikation

Events & Callback-Props

Wie ein Kind mit seiner Eltern-Komponente spricht: In Svelte 5 einfach über Funktionen, die als Props übergeben werden.

Kommunikation nach oben

Props fließen nach unten — aber wie meldet ein Kind ein Ereignis nach oben? In Svelte 5 ganz ohne Sondermechanik: Die Eltern-Komponente übergibt eine Funktion als Prop, das Kind ruft sie zum passenden Zeitpunkt auf. Solche Props nennt man Callback-Props; per Konvention beginnen sie mit on.

NotizFeld.svelte svelte
<script lang="ts">
  interface Props {
    onsave: (text: string) => void;
  }

  let { onsave }: Props = $props();
  let entwurf = $state('');
</script>

<input bind:value={entwurf} placeholder="Notiz…" />
<button onclick={() => onsave(entwurf)}>Speichern</button>

Das Kind kennt die konkrete Logik nicht — es ruft nur onsave(entwurf) auf und übergibt seine Daten. Was damit passiert, entscheidet die Eltern-Komponente.

Eltern reichen die Funktion herein

Auf der Elternseite ist der Callback eine normale Prop — entweder eine benannte Funktion oder eine Inline-Arrow-Funktion. Die Daten, die das Kind übergibt, kommen als Argumente an.

Notizen.svelte svelte
<script lang="ts">
  import NotizFeld from './NotizFeld.svelte';

  let notizen = $state<string[]>([]);

  function speichern(text: string) {
    notizen.push(text);
  }
</script>

<!-- Callback als ganz normale Prop übergeben -->
<NotizFeld onsave={speichern} />

<!-- oder inline: -->
<NotizFeld onsave={(t) => notizen.push(t)} />

Eine Komponente kann beliebig viele Callback-Props haben, auch optionale:

ts
interface Props {
  onsave: (text: string) => void;
  oncancel?: () => void;   // optional
  ondelete?: (id: number) => void;
}

let { onsave, oncancel, ondelete }: Props = $props();

💡 Optionale Callbacks sicher aufrufen

Ist ein Callback optional, prüfe vor dem Aufruf, ob er existiert — etwa mit oncancel?.(). So kracht es nicht, wenn die Eltern-Komponente ihn weglässt.

Kein createEventDispatcher mehr

Wer Svelte 4 kennt: Das alte Event-System mit createEventDispatcher und on:save existiert in den Runes nicht mehr. Callback-Props ersetzen es vollständig — sie sind typsicher, ohne Zusatz-Import und ganz normale Werte.

Svelte 4 (veraltet) svelte
<script>
  // ❌ Svelte 4 — gibt es in Runes NICHT mehr:
  import { createEventDispatcher } from 'svelte';
  const dispatch = createEventDispatcher();

  function speichern() {
    dispatch('save', entwurf); // altes Event-System
  }
</script>

<!-- Eltern: <Kind on:save={handler} /> -->

⚠️ Migration

Triffst du in altem Code auf createEventDispatcher oder on:event, übersetze es in eine Callback-Prop: aus dispatch('save', x) wird onsave(x), aus on:save={h} wird onsave={h}.

Live: Callbacks steuern den State

Hier das Muster innerhalb einer Datei: Die Buttons rufen jeweils dieselbe Funktion aendern(delta, grund) mit unterschiedlichen Argumenten auf — genau so würde ein Kind eine übergebene Callback-Prop aufrufen. Der zentrale Zähler weiß nichts von den einzelnen Buttons.

▶ Callback-Muster · Interaktiv

Punkte: 0

Zusammenfassung

💡 Das Wichtigste

  • Kind→Eltern läuft über Callback-Props: Funktionen als Props.
  • Das Kind ruft onsave(daten) auf, die Eltern liefern die Logik.
  • Konvention: Callback-Props mit on benennen; optionale mit ?.() aufrufen.
  • createEventDispatcher und on:event gibt es in Runes nicht mehr.

🎯 Probier es selbst

Füge der Demo einen „Verdoppeln"-Button hinzu, der aendern(punkte, 'Verdoppeln') aufruft. Überlege dir, wie derselbe Button als Kind-Komponente aussähe, die eine Prop onchange: (delta: number) => void bekommt.