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.
<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.
<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:
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.
<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.
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
onbenennen; optionale mit?.()aufrufen. createEventDispatcherundon:eventgibt 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.