Hoofdstuk 7 van 11

VueJS 3-tutorial: computed properties en hoe caching werkt

geverifieerd op 2 september 2026 · 4 min

Kort antwoord

computed() declareert een waarde die uit andere waarden wordt afgeleid. Vue cachet het resultaat en berekent het alleen opnieuw als een dependency verandert, anders dan een functie die je vanuit de template aanroept en die bij elke render draait. Een computed property hoort puur te zijn: ze leest en geeft terug, zonder side effect.

Aan het einde van dit hoofdstuk, weet je hoe je een waarde uit de state afleidt in plaats van haar met de hand bij te houden.

Een computed property is een waarde die uit andere waarden wordt afgeleid. Vue berekent haar opnieuw zodra een van haar dependencies verandert, en alleen dan. Het is het gereedschap dat je logica buiten de template houdt.

Een eerste berekening

De productkaart moet het merk en het product tonen. Dat kan in de template:

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

Dat werkt, maar de logica raakt verspreid over je HTML. Declareer liever een computed property:

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 krijgt een functie mee en geeft een read-only referentie terug. In het script lees je title.value, in de template {{ title }}, net als bij een ref.

De caching

Dat is het echte verschil met een gewone functie. Een computed property onthoudt haar resultaat en berekent het alleen opnieuw als een van haar dependencies is veranderd.

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>

Bij een concatenatie merk je er niets van. Bij een sortering of een filter over een paar honderd items, op drie plekken in de pagina getoond, wordt het verschil duidelijk.

De geselecteerde variant aansturen

Nu een nuttig geval. Elke variant heeft voortaan zijn eigen voorraad:

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>

Blauw is leverbaar, rood niet. De getoonde afbeelding en de beschikbaarheid hangen nu allebei af van de variant waar de muis boven staat. In plaats van twee variabelen met de hand bij te houden, onthouden we één ding: welke variant geselecteerd is.

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

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

De loop geeft de index door, opgehaald zoals in hoofdstuk 4:

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

De rest volgt vanzelf. image en inStock zijn geen data meer, maar berekeningen:

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

Ga met de muis over de rode stip: de afbeelding verandert, de melding wordt “En rupture” en de knop grijst uit dankzij de class binding. Er is één variabele bewogen, alle drie de weergaven zijn meegegaan.

Geef een boolean terug, geen getal

computed(() => variants.value[selectedVariant.value].quantity) schrijven lijkt te werken: een voorraad van 0 is falsy, een voorraad van 20 is truthy. Maar inStock is dan 20, en toon je die waarde ooit met {{ inStock }}, dan staat er “20” op de pagina. Vergelijk expliciet met > 0.

Wanneer gebruik je een computed property

  • Voor een waarde die uit de state volgt: het totaal van een winkelwagen, een gefilterde lijst, een samengestelde tekst. Dat is het normale geval.
  • Niet voor een side effect. Een computed property hoort een pure functie te zijn: ze leest en geeft terug. Ze wijzigt niets, roept geen API aan en start geen request. Daarvoor bestaan watch en watchEffect.
  • Niet voor een waarde die uit zichzelf verandert, zoals de huidige tijd: niets zou Vue vertellen dat er opnieuw gerekend moet worden.

Een schrijfbare computed property

Standaard is een computed property read-only. Vue waarschuwt in de console als je er een waarde aan probeert toe te kennen. Voor de gevallen waarin schrijven zin heeft, geef je een paar get / set mee:

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

Computed properties staan daar in de optie computed en lezen de state via this: computed: { title() { return this.brand + ' ' + this.product } }. Het cachingprincipe is hetzelfde.

OefeningVoeg een computed property resume toe die op basis van de geselecteerde variant “Gekkode T-Shirt, blauw, op voorraad” teruggeeft. Controleer daarna met een console.log in de functie dat ze niet bij elke render opnieuw wordt berekend.

Veelgemaakte fouten

Een getal teruggeven in plaats van een boolean Een voorraad van 0 is falsy en een voorraad van 20 is truthy, dus de code lijkt te werken. Maar wie de waarde toont, ziet “20”. Vergelijk expliciet: quantity > 0.
Een side effect in een computed property zetten Een netwerkaanroep of een wijziging van de state zou daar op onvoorspelbare momenten afgaan. Gebruik watch of watchEffect.
Een waarde toekennen aan een computed property Ze is standaard read-only, Vue waarschuwt in de console. Geef een get/set-paar mee als schrijven zin heeft.
Nieuwsbrief

Nieuwe tests, tutorials en projecten, per e-mail.

Reproduceerbare tests, geversioneerde code, gedateerde resultaten. Nooit spam.