Vue essentials
<script setup> vs. <script>
De <script setup>-syntaxis biedt een nieuwe manier om componenten te definiëren in Vue 3. Het vervangt de traditionele setup()-functie en biedt een kortere, efficiënte aanpak. Alles wat je in een <script setup>-blok definieert, is direct beschikbaar in de template, zonder dat je extra boilerplate-code nodig hebt.
Voorbeeld: Component met <script setup>
<script setup lang="ts">
const bericht = 'Hallo, Vue 3!';
</script>
<template>
<h1>{{ bericht }}</h1>
</template>
In dit voorbeeld:
- De variabele
berichtis direct beschikbaar in de template. - Er is geen
setup()-functie of explicietereturnnodig.
Vergelijking: Met en zonder <script setup>
Laten we een voorbeeldcomponent bouwen met beide benaderingen, zodat je de verschillen kunt zien.
Klassieke benadering: Zonder <script setup>
Hier gebruiken we de traditionele setup()-functie.
<script lang="ts">
import { defineComponent, ref } from 'vue';
export default defineComponent({
name: 'TellerComponent',
setup() {
const teller = ref(0);
const verhoog = () => {
teller.value++;
};
return {
teller,
verhoog,
};
},
});
</script>
<template>
<div>
<p>Teller: {{ teller }}</p>
<button @click="verhoog">Verhoog</button>
</div>
</template>
Kenmerken:
- Je gebruikt
defineComponentom een Vue-component te definiëren. - De
setup()-functie bevat de logica en retourneert de variabelen en methoden die beschikbaar zijn in de template. - Meer boilerplate-code (bijvoorbeeld
defineComponent,setup()enreturn).
2. Moderne benadering: Met <script setup>
Hetzelfde voorbeeld, maar met <script setup>.
<script setup lang="ts">
import { ref } from 'vue';
const teller = ref(0);
const verhoog = () => {
teller.value++;
};
</script>
<template>
<div>
<p>Teller: {{ teller }}</p>
<button @click="verhoog">Verhoog</button>
</div>
</template>
Kenmerken:
- Geen
defineComponentofsetup()-functie nodig. - Minder boilerplate, wat de code overzichtelijker maakt.
- Alles wat je in het
<script setup>-blok definieert, is direct beschikbaar in de template.
Belangrijke concepten in Vue 3
Reactiviteit met ref
De ref-functie maakt een variabele reactief. Dit betekent dat wijzigingen in de waarde automatisch worden bijgewerkt in de DOM.
Wat is een ref?
Een ref is een eenvoudige manier om reactiviteit toe te voegen aan primitieve waarden (zoals strings, nummers of booleans) en complexe objecten (zoals arrays en objecten). Wanneer een ref-waarde wordt gewijzigd, zorgt Vue ervoor dat de wijzigingen automatisch worden doorgevoerd in de DOM (= document of de html pagina).
Wanneer gebruik je ref?
- Gebruik
refvoor losse, primitieve waarden die reactief moeten zijn. - Voor complexe objecten of meerdere gekoppelde waarden kun je ook
reactivegebruiken, hoewelrefflexibeler is omdat je de.valueexpliciet beheert.
Voorbeeld: Een eenvoudige teller
<script setup lang="ts">
import { ref } from 'vue';
const teller = ref(0);
const verhoog = () => {
teller.value++;
};
</script>
<template>
<div>
<p>Teller: {{ teller }}</p>
<button @click="verhoog">Verhoog</button>
</div>
</template>
Belangrijk:
- Je gebruikt
.valueom de waarde van eenrefte lezen of bij te werken.
Reactieve arrays en objecten
Hoewel ref ideaal is voor simpele waarden, werkt het ook met arrays en objecten. Je moet nog steeds .value gebruiken om toegang te krijgen tot de array of het object.
Voorbeeld: Een reactieve array
<script setup lang="ts">
import { ref, type Ref } from 'vue';
const items: Ref<string[]>= ref(['Appel', 'Banaan']);
const voegToe = (item: string) => {
items.value.push(item);
};
</script>
<template>
<ul>
<li v-for="(item, index) in items.value" :key="index">{{ item }}</li>
</ul>
<button @click="voegToe('Kers')">Voeg Kers toe</button>
</template>
Voorbeeld: Een reactief object
<script setup lang="ts">
import { ref } from 'vue';
const gebruiker = ref({
naam: 'Jan',
leeftijd: 30
});
const verouder = () => {
gebruiker.value.leeftijd++;
};
</script>
<template>
<div>
<p>Naam: {{ gebruiker.value.naam }}</p>
<p>Leeftijd: {{ gebruiker.value.leeftijd }}</p>
<button @click="verouder">Verouder</button>
</div>
</template>
Tip:
Gebruik .value altijd bij het werken met ref.
Verschil tussen ref en reactive
refwerkt met een enkele reactieve waarde en vereist.value.reactivemaakt een heel object reactief, zonder.valuete vereisen.
<script setup lang="ts">
import { reactive } from 'vue';
const gebruiker = reactive({
naam: 'Jan',
leeftijd: 30
});
const verouder = () => {
gebruiker.leeftijd++;
};
</script>
<template>
<div>
<p>Naam: {{ gebruiker.naam }}</p>
<p>Leeftijd: {{ gebruiker.leeftijd }}</p>
<button @click="verouder">Verouder</button>
</div>
</template>
Tweewegsdatabinding met v-model
In Vue.js is v-model een handige directive die wordt gebruikt om two-way data binding te implementeren. Dit betekent dat wijzigingen in een HTML-element (zoals een input, checkbox, of textarea) automatisch de waarde in een data-eigenschap (variabele) in de Vue-component bijwerken en vice versa.
Wanneer je v-model op een element gebruikt:
- Het HTML-element leest een waarde van een eigenschap in de Vue-component.
- Het HTML- element schrijft veranderingen (zoals gebruikersinvoer) terug naar die eigenschap.
Voorbeeld: Naam invoeren
<script setup lang="ts">
import { ref } from 'vue';
const naam = ref('');
</script>
<template>
<div>
<input v-model="naam" placeholder="Voer je naam in" />
<p>Je naam is: {{ naam }}</p>
</div>
</template>
Belangrijke bronnen v-model:
Conditionele rendering met v-if
Met v-if kun je elementen alleen weergeven als een bepaalde voorwaarde waar is.
Voorbeeld: Element tonen/verbergen
<script setup lang="ts">
import { ref } from 'vue';
const zichtbaar = ref(false);
const schakel = () => {
zichtbaar.value = !zichtbaar.value;
};
</script>
<template>
<div>
<button @click="schakel">Schakel zichtbaarheid</button>
<p v-if="zichtbaar">Dit element is zichtbaar!</p>
</div>
</template>
Lijsten renderen met v-for
Met v-for kun je herhalende elementen in de DOM renderen op basis van een array.
Voorbeeld: Een lijst van fruit
<script setup lang="ts">
const fruit = ['Appel', 'Banaan', 'Kers'];
</script>
<template>
<ul>
<li v-for="(stuk, index) in fruit" :key="index">{{ stuk }}</li>
</ul>
</template>
Event Handlers
In Vue 3 worden event handlers gebruikt om gebruikersinteracties, zoals klikken, invoer, en het bewegen van de muis, af te handelen. Dit gebeurt door het koppelen van events aan methodes of inline code in je component.
@click Event Handler
De @click directive wordt gebruikt om een methode uit te voeren wanneer een element wordt aangeklikt.
Voorbeeld:
<template>
<button @click="sayHello">Klik mij</button>
</template>
<script setup>
function sayHello() {
alert("Hallo, wereld!");
}
</script>
@clickis een afkorting voorv-on:click.sayHellois een functie die wordt uitgevoerd wanneer de knop wordt aangeklikt.
Event Handlers met Inline Code
Je kunt ook inline JavaScript gebruiken in plaats van een methode. Dit kan handig zijn voor eenvoudige acties zoals het verhogen van een teller.
Voorbeeld:
<template>
<button @click="count++">Klik om te verhogen: {{ count }}</button>
</template>
<script setup>
import { ref } from 'vue';
const count = ref(0);
</script>
count++verhoogt de waarde van de teller direct.ref(0)wordt gebruikt om een reactieve variabele te maken in Vue.
Event met Parameters
Wil je parameters doorgeven aan een methode? Gebruik dan een arrow function.
Voorbeeld:
<template>
<button @click="() => greet('Vue')">Zeg Hallo</button>
</template>
<script setup>
function greet(name) {
alert(`Hallo, ${name}!`);
}
</script>
() => greet('Vue')is een inline arrow function die de parameter 'Vue' doorgeeft aan degreet-functie.
Meerdere Events
Je kunt meerdere events koppelen aan een enkel element, bijvoorbeeld om acties te ondernemen bij het focussen of verliezen van focus.
Voorbeeld:
<template>
<input
@focus="onFocus"
@blur="onBlur"
placeholder="Focus op mij"
/>
</template>
<script setup>
function onFocus() {
console.log("Input is in focus!");
}
function onBlur() {
console.log("Input is niet meer in focus.");
}
</script>
@focuswordt uitgevoerd wanneer het element in focus komt.@blurwordt uitgevoerd wanneer het element de focus verliest.
Event Object Gebruiken
Je kunt het event object gebruiken door het expliciet door te geven aan je functie.
Voorbeeld:
<template>
<button @click="logEvent">Klik om event te loggen</button>
</template>
<script setup>
function logEvent(event) {
console.log("Event Type:", event.type);
}
</script>
eventbevat informatie over het event, zoals het type en het doelwit.
Modifier Keys
Modifiers in Vue maken het mogelijk om gedrag aan te passen of events te filteren. Hier zijn twee veelgebruikte modifiers:
@click.prevent: Voorkomt de standaard actie van een event.@click.stop: Voorkomt dat het event omhoog "bubbelt" naar bovenliggende elementen.
Voorbeeld:
<template>
<form @submit.prevent="submitForm">
<input type="text" placeholder="Type iets" />
<button type="submit">Verzend</button>
</form>
</template>
<script setup>
function submitForm() {
alert("Formulier verzonden!");
}
</script>
@submit.preventvoorkomt dat de browser de standaardactie uitvoert bij het indienen van het formulier (zoals een paginavernieuwing).