Kapitel 7 von 11

VueJS-3-Tutorial: berechnete Eigenschaften mit computed

geprüft am 2 September 2026 · 4 Min.

Schnelle Antwort

computed() deklariert einen Wert, der sich aus anderen Werten ergibt. Vue legt das Ergebnis im Cache ab und berechnet es nur neu, wenn sich eine Abhängigkeit ändert, anders als eine Funktion, die aus dem Template heraus bei jedem Rendering läuft. Eine berechnete Eigenschaft muss rein sein: sie liest und gibt zurück, ohne Seiteneffekt.

Am Ende dieses Kapitels, kannst du einen Wert aus dem State ableiten, statt ihn von Hand aktuell zu halten.

Eine berechnete Eigenschaft ist ein Wert, der sich aus anderen Werten ergibt. Vue berechnet ihn neu, wenn sich eine seiner Abhängigkeiten ändert, und nur dann. Das ist das Werkzeug, das die Logik aus dem Template heraushält.

Eine erste Berechnung

Das Produktdatenblatt soll Marke und Produkt anzeigen. Man könnte das im Template erledigen:

html
<h1>{{ brand + ' ' + product }}</h1>

Das funktioniert, aber die Logik verteilt sich im HTML. Deklarier lieber eine berechnete Eigenschaft:

src/App.vue
<script setup>
import { computed, ref } from 'vue'

const product = ref('T-Shirt')
const brand = ref('Gekkode')

const title = computed(() => `${brand.value} ${product.value}`)
</script>

<template>
  <h1>{{ title }}</h1>
</template>

computed bekommt eine Funktion und gibt eine Referenz zurück, die nur gelesen werden kann. Im Skript liest du title.value, im Template {{ title }}, wie bei einem ref.

Das Caching

Das ist der eigentliche Unterschied zu einer gewöhnlichen Funktion. Eine berechnete Eigenschaft merkt sich ihr Ergebnis und berechnet es nur neu, wenn sich eine ihrer Abhängigkeiten geändert hat.

html
<!-- appelée à chaque rendu, même si rien n’a changé -->
<p>{{ calculerTitre() }}</p>

<!-- calculée une fois, puis relue depuis le cache -->
<p>{{ title }}</p>

Bei einer Verkettung von zwei Strings macht das keinen Unterschied. Bei einer Sortierung oder einem Filter über mehrere hundert Einträge, an drei Stellen der Seite ausgegeben, wird er deutlich.

Die ausgewählte Variante steuern

Jetzt zu einem nützlichen Fall. Jede Variante hat nun ihren eigenen Lagerbestand:

src/App.vue
<script setup>
const variants = ref([
  { id: 2234, color: '#2563eb', image: '/images/t-shirt-bleu.svg', quantity: 20 },
  { id: 2235, color: '#dc2626', image: '/images/t-shirt-rouge.svg', quantity: 0 }
])
</script>

Blau ist verfügbar, Rot nicht. Das angezeigte Bild und die Verfügbarkeit hängen jetzt beide von der Variante ab, über der die Maus steht. Statt zwei Variablen von Hand aktuell zu halten, merken wir uns nur eine Information: welche Variante ausgewählt ist.

src/App.vue
<script setup>
const selectedVariant = ref(0)

function updateVariant(index) {
  selectedVariant.value = index
}
</script>

Die Schleife gibt den Index weiter, den wir uns wie in Kapitel 4 holen:

src/App.vue
<div
  v-for="(variant, index) in variants"
  :key="variant.id"
  class="color-circle"
  :style="{ backgroundColor: variant.color }"
  @mouseover="updateVariant(index)"
></div>

Der Rest ergibt sich daraus. image und inStock sind keine Daten mehr, sondern Berechnungen:

src/App.vue
<script setup>
const image = computed(() => variants.value[selectedVariant.value].image)
const inStock = computed(() => variants.value[selectedVariant.value].quantity > 0)
</script>

Fahr mit der Maus über das rote Farbfeld: das Bild wechselt, die Meldung springt auf „En rupture“, und der Button wird über das Klassen-Binding ausgegraut. Eine einzige Variable hat sich bewegt, drei Anzeigen sind mitgegangen.

Gib einen Boolean zurück, keine Zahl

computed(() => variants.value[selectedVariant.value].quantity) zu schreiben sieht aus, als würde es funktionieren: eine Menge von 0 ist falsy, eine Menge von 20 ist truthy. Nur enthält inStock dann 20, und sobald du den Wert eines Tages mit {{ inStock }} ausgibst, steht auf der Seite „20“. Vergleich ausdrücklich mit > 0.

Wann eine berechnete Eigenschaft passt

  • Ein aus dem State abgeleiteter Wert: Warenkorbsumme, gefilterte Liste, zusammengesetzter Text. Das ist der Normalfall.
  • Nicht für einen Seiteneffekt. Eine berechnete Eigenschaft muss eine reine Funktion sein: sie liest, sie gibt zurück. Sie ändert nichts, ruft keine API auf, löst keinen Request aus. Dafür gibt es watch und watchEffect.
  • Nicht für einen Wert, der sich von allein ändert, etwa die aktuelle Uhrzeit: nichts würde Vue mitteilen, dass neu zu rechnen ist.

Eine berechnete Eigenschaft mit Schreibzugriff

Standardmäßig ist eine berechnete Eigenschaft schreibgeschützt. Vue warnt in der Konsole, wenn du ihr einen Wert zuweist. Für die Fälle, in denen Schreiben sinnvoll ist, gibst du ein Paar aus get und set an:

javascript
const nomComplet = computed({
  get: () => `${prenom.value} ${nom.value}`,
  set: (valeur) => {
    [prenom.value, nom.value] = valeur.split(' ')
  }
})
In der Options API

Berechnete Eigenschaften stehen dort in der Option computed und lesen den State über this: computed: { title() { return this.brand + ' ' + this.product } }. Das Prinzip des Cachings ist dasselbe.

ÜbungErgänze eine berechnete Eigenschaft resume, die aus der ausgewählten Variante „Gekkode T-Shirt, blau, auf Lager“ zurückgibt. Prüf dann mit einem console.log in der Funktion, dass sie nicht bei jedem Rendering neu berechnet wird.

Häufige Fehler

Eine Zahl statt eines Boolean zurückgeben Eine Menge von 0 ist falsy, eine Menge von 20 ist truthy, der Code sieht also funktionierend aus. Nur würde die Ausgabe des Werts „20“ zeigen. Vergleich ausdrücklich: quantity > 0.
Einen Seiteneffekt in eine berechnete Eigenschaft packen Ein Netzwerkaufruf oder eine State-Änderung würde dort unvorhersehbar ausgelöst. Nimm watch oder watchEffect.
Einer berechneten Eigenschaft einen Wert zuweisen Sie ist standardmäßig schreibgeschützt, Vue warnt in der Konsole. Gib ein get/set-Paar an, wenn Schreiben sinnvoll ist.
Newsletter

Neue Tests, Tutorials und Projekte, per E-Mail.

Reproduzierbare Tests, versionierter Code, datierte Ergebnisse. Niemals Spam.