Hoofdstuk 6 van 11

Vue 3-tutorial: classes en styles binden aan de state

geverifieerd op 2 september 2026 · 4 min

Kort antwoord

:class accepteert een object waarvan de sleutels classnamen zijn en de waarden voorwaarden, :style accepteert een object met CSS-eigenschappen die in camel case geschreven zijn. Het statische attribuut class en het dynamische :class bestaan naast elkaar: Vue voegt ze samen.

Aan het einde van dit hoofdstuk, weet je hoe je de state van de applicatie in het uiterlijk laat doorwerken, zonder het DOM aan te raken.

class en style zijn twee bijzondere attributen: naast strings accepteert v-bind er ook objecten en arrays. Daarmee laat je de state van de applicatie in het uiterlijk doorwerken zonder het DOM met de hand aan te raken.

Gekleurde bolletjes

Laten we de woorden ‘Blauw’ en ‘Rood’ vervangen door bolletjes in de echte kleur. Sla eerst een hexadecimale code op in plaats van een naam:

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

Bind daarna de achtergrondkleur:

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

Er verschijnen twee ronde bolletjes, een blauw en een rood, en de hover wisselt nog steeds de afbeelding.

Camel case of kebab case

Het object dat je aan :style geeft, is een JavaScript-object. De namen van de CSS-eigenschappen schrijf je er dus in camel case:

html
<div :style="{ backgroundColor: variant.color }"></div>

background-color zonder aanhalingstekens zou als een aftrekking worden gelezen. Kebab case blijft mogelijk, tussen aanhalingstekens:

html
<div :style="{ 'background-color': variant.color }"></div>

Beide vormen geven hetzelfde resultaat. Kies er één en houd je eraan.

De stijl uit de template halen

Zodra de eigenschappen zich opstapelen, wordt de template onleesbaar. Declareer het object in het script:

src/App.vue
<script setup>
const styleTitre = ref({
  color: '#111827',
  fontSize: '28px',
  fontWeight: '700'
})
</script>

<template>
  <h1 :style="styleTitre">{{ product }}</h1>
</template>

Met een array combineer je meerdere objecten, waarbij de laatste het winnen van de eerste:

html
<div :style="[styleBase, styleSurcharge]"></div>

Een class binden

Nu de knop. Is het product uitverkocht, dan moet die tegelijk uitgeschakeld zijn en er uitgeschakeld uitzien.

Begin met het attribuut disabled, gebonden zoals in hoofdstuk 2:

src/App.vue
<button class="button" :disabled="!inStock" @click="addToCart">
  Ajouter au panier
</button>

De knop reageert niet meer op een klik, maar niets laat dat zien. Voeg de grijze class toe, met dezelfde voorwaarde:

src/App.vue
<button
  class="button"
  :class="{ disabledButton: !inStock }"
  :disabled="!inStock"
  @click="addToCart"
>
  Ajouter au panier
</button>

In het object dat je aan :class geeft, is de sleutel de naam van de class en de waarde de voorwaarde. Is !inStock waar, dan wordt de class disabledButton toegevoegd, anders wordt ze weggehaald.

class en :class bestaan naast elkaar

De knop draagt zowel class="button" als :class="{ … }". Vue laat ze niet met elkaar concurreren: het voegt ze samen.

html
<!-- écrit dans le gabarit -->
<button class="button" :class="{ disabledButton: true }">

<!-- rendu dans la page -->
<button class="button disabledButton">

Houd de vaste classes in class en de voorwaardelijke in :class.

Meerdere voorwaardelijke classes

Het object accepteert zoveel items als nodig:

html
<div :class="{ actif: estActif, 'en-erreur': aUneErreur, masque: !visible }"></div>

Een classnaam met een koppelteken moet tussen aanhalingstekens, om dezelfde reden als de kebab case bij de styles.

Kiezen tussen twee classes

Het object voegt een class toe of haalt ze weg. Wil je tussen twee classes wisselen, gebruik dan een ternaire operator in een array:

html
<div :class="[inStock ? 'enStock' : 'enRupture']"></div>

De array accepteert ook een mengeling van strings en objecten:

html
<div :class="['color-circle', { selectionne: index === selectedVariant }]"></div>

Waar je de CSS zet

Een single-file component kan zijn eigen stijl dragen, afgeschermd door het attribuut scoped:

src/App.vue
<style scoped>
.color-circle {
  width: 50px;
  height: 50px;
  border-radius: 50%;
  cursor: pointer;
}
</style>

Die classes kun je ook animeren: dat is het onderwerp van het hoofdstuk over transities.

Met scoped gelden die regels alleen voor de elementen van dit component: Vue zet een uniek attribuut op de tags en neemt dat op in de selector. Zo voorkom je dat een class .button uit het ene component een ander overschildert.

In de Options API

Aan de template verandert niets. Het style-object zou je in data() declareren, of beter in computed als het van iets anders afhangt.

OefeningVoeg een class selectionnee toe aan het actieve kleurbolletje, met een dikkere rand. Je hebt de index van de lus en de geselecteerde variant nodig.

Veelgemaakte fouten

background-color zonder aanhalingstekens In het object dat je aan :style geeft, wordt het koppelteken als een aftrekking gelezen. Schrijf backgroundColor, of 'background-color' tussen aanhalingstekens.
Denken dat :class de class overschrijft De twee attributen worden samengevoegd. Houd de vaste classes in class en de voorwaardelijke in :class.
Een classnaam met een koppelteken zonder aanhalingstekens { en-erreur: vrai } is ongeldig JavaScript: het moet { 'en-erreur': vrai } zijn.
Nieuwsbrief

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

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