bind: ist eines der charakteristischsten Konstrukte in Svelte: Es verbindet einen reaktiven Wert direkt mit einem DOM-Property oder einer Komponenten-Prop, sodass beide automatisch synchron bleiben — ohne manuell value= und oninput= zu schreiben. Dieser Artikel gibt die Übersicht über alle verfügbaren Bindings, unterscheidet zwischen Two-Way- und Read-only-Bindings und zeigt, wann ein Binding gegenüber einem klassischen Event-Handler die elegantere Wahl ist.

Was macht bind:?

Ohne Binding schreibst du klassisch zwei Stellen — eine zum Lesen, eine zum Reagieren auf Änderungen:

svelte − Manuell mit Event
<script>
    let name = $state('');
</script>

<input value={name} oninput={(e) => name = e.currentTarget.value} />

Mit bind:value reicht eine Direktive — Svelte macht beides automatisch:

svelte + Mit bind:
<input bind:value={name} />

bind: ist syntaktischer Zucker für die Two-Way-Synchronisierung zwischen einer Variablen und einem DOM-Property.

Two-Way- vs. Read-only-Bindings

Nicht jedes Binding lässt sich von beiden Seiten beschreiben:

  • Two-Way: bind:value, bind:checked, bind:files, bind:open, bind:currentTime — du kannst lesen und schreiben.
  • Read-only: bind:clientWidth, bind:duration, bind:naturalWidth etc. — du kannst nur lesen. Diese Werte werden vom Browser bestimmt; ein Schreibversuch wird ignoriert.

Read-only-Bindings sind trotzdem reaktiv: Wenn der Browser den Wert ändert (z. B. weil sich die Fenstergröße ändert), wird die Variable im Script aktualisiert.

Übersicht aller Bindings

Form-Elemente

BindingElementRichtungWert-Typ
bind:valueinput, textarea, selectTwo-Waystring/number/array
bind:checkedcheckbox, radioTwo-Wayboolean
bind:indeterminatecheckboxTwo-Wayboolean
bind:groupradio, checkboxTwo-Waystring/array
bind:filesinput[type=file]Two-WayFileList

Media-Elemente (audio, video)

BindingRichtungBeschreibung
bind:currentTimeTwo-WayAktuelle Wiedergabe-Position
bind:playbackRateTwo-WayGeschwindigkeit
bind:pausedTwo-WayPause-Zustand
bind:volumeTwo-WayLautstärke (0–1)
bind:mutedTwo-WayStumm
bind:durationRead-onlyGesamtdauer
bind:bufferedRead-onlyGepufferte Bereiche
bind:seekableRead-onlySeekbare Bereiche
bind:seekingRead-onlyAktuell am Seeken
bind:endedRead-onlyWiedergabe beendet
bind:readyStateRead-onlyLadezustand
bind:playedRead-onlyBereits abgespielte Bereiche

Für <video> zusätzlich:

BindingRichtungBeschreibung
bind:videoWidthRead-onlyNative Videobreite
bind:videoHeightRead-onlyNative Videohöhe

Bilder

BindingRichtungBeschreibung
bind:naturalWidthRead-onlyNative Bildbreite
bind:naturalHeightRead-onlyNative Bildhöhe

Block-Level (Größen)

Auf jedem HTML-Element verfügbar:

BindingRichtungBeschreibung
bind:clientWidthRead-onlySichtbare Breite ohne Scrollbar
bind:clientHeightRead-onlySichtbare Höhe
bind:offsetWidthRead-onlyAußenmaß inkl. Border
bind:offsetHeightRead-onlyAußenhöhe
bind:contentRectRead-onlyDOMRect aus ResizeObserver
bind:contentBoxSizeRead-onlyContent-Box-Maße
bind:borderBoxSizeRead-onlyBorder-Box-Maße
bind:devicePixelContentBoxSizeRead-onlyPixel-genaue Content-Box

Diese werden intern von einem ResizeObserver versorgt — kein eigener Listener nötig.

Spezielle Elemente

BindingElementRichtung
bind:open<details>Two-Way
bind:innerHTMLcontenteditableTwo-Way
bind:innerTextcontenteditableTwo-Way
bind:textContentcontenteditableTwo-Way

Refs

BindingBeschreibung
bind:thisReferenz auf DOM-Knoten oder Komponenten-Instanz

Komponenten

BindingRichtungAnforderung
bind:propertyNameTwo-WayProp muss $bindable() sein

Bindings sind reaktiv

Das Schöne: Sobald die gebundene Variable mit $state reaktiv ist, wirken Updates in beide Richtungen — und alle abgeleiteten Werte aktualisieren sich automatisch:

svelte Beispiel mit derived
<script>
    let name = $state('');
    let charCount = $derived(name.length);
</script>

<input bind:value={name} />
<p>{charCount} Zeichen</p>

Bei jeder Eingabe aktualisiert sich name (Browser -> Variable), und charCount (Variable -> UI) berechnet sich neu.

Wann bind:, wann manuell?

SituationEmpfehlung
Reine Synchronisation Variable ↔ DOMbind:
Validierung beim Eingebenmanueller oninput-Handler
Throttling oder Debouncingmanueller Handler oder Custom-Hook
Logging / Analytics bei Änderungmanueller Handler
Lese-Zugriff auf Browser-WerteRead-only-bind: (z. B. Größen, Media)

Sobald Logik beim Update gefragt ist, liefert ein expliziter Event-Handler mehr Kontrolle. Für reine Form-Felder ohne Logik ist bind: aber unschlagbar kompakt.

Bindings und Reaktivität — wichtiges Detail

Damit bind: funktioniert, muss die Ziel-Variable reaktiv sein. Ein nacktes let reicht in Svelte 5 nicht:

svelte − Nicht reaktiv
<script>
    let value = ''; // kein $state
</script>

<input bind:value /> <!-- Funktioniert nur eingeschränkt -->
svelte + Mit $state
<script>
    let value = $state('');
</script>

<input bind:value />

Im Legacy-Modus (Svelte 4) waren let-Variablen automatisch reaktiv — in Svelte 5 mit Runes ist $state Pflicht.

Beispiel: Live-Vorschau eines Eingabefelds

svelte Live-Preview
<script>
    let title = $state('Mein Beitrag');
    let body = $state('');
</script>

<form>
    <label>
        Titel
        <input bind:value={title} />
    </label>
    <label>
        Inhalt
        <textarea bind:value={body} rows="4"></textarea>
    </label>
</form>

<article>
    <h1>{title || '(ohne Titel)'}</h1>
    <p>{body || '(noch leer)'}</p>
</article>

Eingabe links, Vorschau rechts — kein einziger Event-Handler, nichts zum Vergessen.

Häufige Stolperfallen

Bind ohne reaktive Variable. bind:value={value} mit nicht-$state-Variable führt zu seltsamem Verhalten oder Compiler-Warnung.

Bind auf abgeleiteten Wert. bind:value={fullName} mit fullName als $derived geht nicht — abgeleitete Werte sind nicht beschreibbar.

Konflikt zwischen bind:value und value=.... Beides gleichzeitig zu setzen führt zu undefiniertem Verhalten. Entweder bind: oder manuelle Steuerung — nicht beides.

Numerische Inputs liefern Strings. <input type="number"> gibt mit bind:value automatisch eine Zahl zurück — keine Konvertierung nötig. Bei type="text" mit numerischer Eingabe ist es weiterhin ein String.

Bind auf Komponenten-Property ohne $bindable. Compiler-Fehler. Die Prop muss in der Kind-Komponente explizit als bindbar markiert sein — siehe $bindable.

Weiterführende Ressourcen

Externe Quellen

Verwandte Artikel

/ Weiter

Zurück zu Bindings

Zur Übersicht