S SvelteKurs
M2 · Runes & Reaktivität

$state — reaktiver Zustand

Die wichtigste Rune: aus einer normalen Variable wird reaktiver Zustand, der die Oberfläche automatisch aktualisiert.

Was ist eine Rune?

Runes sind spezielle Symbole mit einem $-Präfix, die Svelte 5 dem Compiler als Anweisungen gibt. $state ist die grundlegendste: Sie macht aus einer Variable reaktiven Zustand. Ändert sich der Wert, aktualisiert Svelte automatisch jede Stelle im Markup, die ihn verwendet.

Zaehler.svelte svelte
<script>
  let count = $state(0);
</script>

<button onclick={() => count++}>
  Geklickt: {count}
</button>

Kein setState, kein .value, kein ref() — du änderst die Variable ganz normal (count++), und die Oberfläche folgt.

🛤️ Rails-Vergleich: Instance-Variable vs. reaktiver State

In Rails ist @count ein Snapshot zum Request-Zeitpunkt. In Svelte lebt $state im Browser weiter und reagiert auf jede Änderung — ohne neuen Request.

Rails ruby
# Rails: @variable wird EINMAL gesetzt und gerendert
class DashboardController < ApplicationController
  def show
    @count = Order.count   # Snapshot zum Request-Zeitpunkt
    # Ändert sich etwas, muss die Seite neu geladen werden
  end
end

Live ausprobieren

Der folgende Zähler ist echter $state-Code aus dieser Seite:

▶ $state-Zähler · Interaktiv
0

Der Wert steht auf 0 — die Anzeige aktualisiert sich, sobald du klickst.

Objekte und Arrays

$state funktioniert nicht nur mit Zahlen, sondern auch mit Objekten und Arrays — und zwar tief: Auch verschachtelte Änderungen und Array-Methoden wie push werden erkannt.

js
let user = $state({ name: 'Anna', punkte: 0 });

// Einfach mutieren — Svelte verfolgt auch verschachtelte Änderungen:
user.punkte += 10;
user.name = 'Bob';
js
let todos = $state([]);

todos.push('Milch kaufen');   // ✅ reaktiv
todos[0] = 'Brot kaufen';     // ✅ reaktiv
todos.length = 0;             // ✅ auch das
▶ Reaktive Liste · Interaktiv

Noch keine Einträge — füge etwas hinzu.

Zusammenfassung

💡 Das Wichtigste

  • $state(wert) macht eine Variable reaktiv.
  • Du änderst sie wie eine normale Variable — kein Setter nötig.
  • Reaktivität ist tief: Objekte, Arrays und Mutationen inklusive.

🎯 Probier es selbst

Erweitere den Zähler-Demo um einen „Zurücksetzen"-Button, der count = 0 setzt. Beobachte, dass keine weitere Verdrahtung nötig ist.