@click basics
In Vue luister je naar events met @event (afkorting voor v-on:event). De bekendste is @click.
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
<template>
<button @click="count++">Count: {{ count }}</button>
</template>
Maar er zijn veel meer events: @input, @submit, @mouseover, @keyup, etc.
<input @input="handleInput" />
<form @submit="handleSubmit">...</form>
<div @mouseover="handleHover">Hover me</div>
Inline of functie?
Je kunt op twee manieren reageren op een event:
1. Inline expressie — voor simpele acties
<button @click="count++">+1</button>
<button @click="isOpen = true">Open</button>
<button @click="items = []">Reset</button>
2. Functie aanroepen — voor meer logica
<script setup>
import { ref } from 'vue'
const items = ref([])
const addItem = () => {
items.value.push('Nieuw item')
console.log('Item toegevoegd')
}
</script>
<template>
<button @click="addItem">Add</button>
</template>
Belangrijk:
@click="addItem" <!-- ✅ verwijst naar de functie -->
@click="addItem()" <!-- ✅ roept de functie aan (zelfde resultaat) -->
Beide werken voor functies zonder argumenten. Met argumenten moet je () gebruiken:
@click="addItem('hello')" <!-- ✅ -->
Het event object
Soms heb je informatie over het event nodig — bijvoorbeeld de waarde van een input. Vue geeft je het event object op twee manieren:
Manier 1: functie zonder argumenten
<script setup>
const handleInput = (event) => {
console.log(event.target.value)
}
</script>
<template>
<input @input="handleInput" />
</template>
Manier 2: $event bij inline of met argumenten
<script setup>
const log = (msg, event) => {
console.log(msg, event.target)
}
</script>
<template>
<input @input="log('getypt:', $event)" />
</template>
Vuistregel: Roep je een functie aan zonder ()? Dan krijg je het event automatisch als eerste argument. Roep je hem met argumenten aan? Gebruik $event om het event ook mee te geven.
In de praktijk: bij inputs gebruik je meestal v-model — dan hoef je het event helemaal niet aan te raken.
Event modifiers — .prevent en .stop
Vue heeft handige korte schrijfwijzen voor veelgebruikte event-acties. Je voegt ze toe met een punt achter het event-name.
.prevent — voorkom default gedrag
Vooral handig bij formulieren: voorkomt dat de pagina ververst bij submit.
<!-- Zonder modifier -->
<form @submit="handleSubmit">
...
</form>
<script setup>
const handleSubmit = (event) => {
event.preventDefault() // 😩 elke keer typen
// ...
}
</script>
<!-- Met .prevent — veel korter -->
<form @submit.prevent="handleSubmit">
...
</form>
<script setup>
const handleSubmit = () => {
// pagina ververst niet meer ✅
}
</script>
.stop — stop event propagatie
Soms wil je dat een click niet "doorbubbelt" naar parent elementen.
<div @click="openDetail">
<p>Klik om detail te zien</p>
<!-- Deze knop opent NIET de detail, alleen verwijderen -->
<button @click.stop="deleteItem">Verwijder</button>
</div>
Deze twee dek je 95% van de gevallen mee:
.prevent→ bij@submitop forms, bij@clickop een<a>.stop→ bij geneste click-handlers
Toets-events — .enter en .escape
Wil je alleen reageren als de gebruiker een specifieke toets indrukt? Gebruik een key modifier.
<script setup>
import { ref } from 'vue'
const search = ref('')
const doSearch = () => {
console.log('Zoeken naar:', search.value)
}
</script>
<template>
<input
v-model="search"
@keyup.enter="doSearch"
placeholder="Typ en druk op Enter..."
/>
</template>
Meest gebruikte key modifiers
@keyup.enter— Enter ingedrukt (zoeken, opslaan)@keyup.escape— Escape (modal sluiten)@keyup.tab— Tab@keyup.delete— Delete of Backspace
Praktisch voorbeeld: een modal die sluit met Escape:
<div @keyup.escape="closeModal">
<!-- modal content -->
</div>
Belangrijke Regels
@event= afkorting voorv-on:event— altijd@gebruiken- Functie aanroepen?
@click="fn"of@click="fn()"— beide werken - Met argumenten →
@click="fn(arg)"(haakjes verplicht) - Event object nodig? → functie krijgt het automatisch, of gebruik
$eventinline - Form submit → altijd
@submit.prevent
Veelgemaakte Fouten
Fout — page refresht bij submit:
<form @submit="handleSubmit"> <!-- ❌ pagina ververst -->
<button type="submit">Send</button>
</form>
Goed:
<form @submit.prevent="handleSubmit"> <!-- ✅ blijft staan -->
<button type="submit">Send</button>
</form>
Fout — functie direct aanroepen i.p.v. doorgeven:
<button @click="addItem('hello')()" >Add</button>
<!-- ❌ je roept het resultaat aan, niet de functie -->
Goed:
<button @click="addItem('hello')">Add</button>
<!-- ✅ -->
Fout — $event vergeten bij argumenten + event:
<input @input="log('typed:')" />
<!-- ❌ log krijgt geen event mee -->
Goed:
<input @input="log('typed:', $event)" />
<!-- ✅ -->