slogan3

Help me bij het implementeren van herbruikbare Vue.js-componenten met props en events.

description

Het creëren van herbruikbare componenten verbetert het onderhoud, vermindert code duplicatie en bevordert een consistente gebruikersinterface in je Vue.js-toepassing.

prompt

try_prompt

Guide me in creating reusable Vue.js components that can accept props and emit events for parent communication. Explain how to define props, validate their types, and ... more
generate_helper
disclaimerOnPageApi image_legal_disclaimer...

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een stapsgewijze gids om een herbruikbare Vue.js-component te maken genaamd `Gebruikersprofiel`, die props accepteert en gebeurtenissen emit voor communicatie met de oudercomponent. ### 1. Componentstructuur Maak een nieuw bestand, bijvoorbeeld `Gebruikersprofiel.vue`, en structuur deze als volgt: ```vue <template> <div class="gebruikersprofiel"> <h2>{{ titel }}</h2> <p>{{ beschrijving }}</p> <button @click="verzenden">Verzenden</button> <button @click="annuleren">Annuleren</button> </div> </template> <script> export default { name: 'Gebruikersprofiel', props: { // Definieer de props met type en optioneel een default waarde titel: { type: String, required: true // verplicht te geven }, beschrijving: { type: String, default: '' // optioneel, standaard leeg } }, methods: { verzenden() { // Emit een event naar de ouder, eventueel met data this.$emit('opVerzenden'); }, annuleren() { // Emit een event naar de ouder this.$emit('opAnnuleren'); } } } </script> <style scoped> /* Voeg hier je stijlen toe */ </style> ``` ### 2. Hoe props te definiëren en te valideren - **props**: in de `props` optie definieer je de verwachte eigenschappen. - **Type**: gebruik `type` om het datatype te specificeren (bijv. String, Number, Boolean). - **Required**: voeg `required: true` toe als de prop verplicht is. - **Default**: geef een standaardwaarde met `default` indien nodig. Voorbeeld: ```js props: { titel: { type: String, required: true }, beschrijving: { type: String, default: '' } } ``` ### 3. Gebeurtenissen (events) emitten Gebruik `this.$emit('evenementNaam')` om een gebeurtenis naar de ouder te sturen. In het voorbeeld: ```js methods: { verzenden() { this.$emit('opVerzenden'); }, annuleren() { this.$emit('opAnnuleren'); } } ``` ### 4. Gebruiken in de oudercomponent Implementeer de `Gebruikersprofiel` component en luister naar de events: ```vue <template> <div> <Gebruikersprofiel titel="Mijn Profiel" beschrijving="Dit is een voorbeeld profiel." @opVerzenden="handleVerzenden" @opAnnuleren="handleAnnuleren" /> </div> </template> <script> import Gebruikersprofiel from './Gebruikersprofiel.vue'; export default { components: { Gebruikersprofiel }, methods: { handleVerzenden() { alert('Verzenden knop geklikt!'); }, handleAnnuleren() { alert('Annuleren knop geklikt!'); } } } </script> ``` ### Samenvatting - Definieer props met types en validatie. - Gebruik `$emit()` om gebeurtenissen naar de ouder te sturen. - In de oudercomponent luister je naar de events en handel je deze af. Wil je dat ik je help met een volledig werkend voorbeeld of meer functies?
provider: deepseek
model: deepseek-chat
Zal ik je begeleiden bij het maken van een herbruikbaar Vue.js component genaamd `Gebruikersprofiel`. Hier is een complete uitleg: ## 1. Component Basisstructuur ```vue <template> <div class="gebruikersprofiel"> <h2>{{ titel }}</h2> <p>{{ beschrijving }}</p> <!-- Voorbeeld formulier/interactie --> <form @submit.prevent="verzenden"> <div> <label>Naam:</label> <input type="text" v-model="lokaleNaam" /> </div> <div> <label>Email:</label> <input type="email" v-model="lokaalEmail" /> </div> <div class="knoppen"> <button type="submit">Verzenden</button> <button type="button" @click="annuleren">Annuleren</button> </div> </form> </div> </template> <script> export default { name: 'Gebruikersprofiel', // Props definiëren props: { titel: { type: String, required: true, default: 'Standaard Titel' }, beschrijving: { type: String, required: false, default: 'Standaard beschrijving' } }, data() { return { lokaleNaam: '', lokaalEmail: '' } }, methods: { verzenden() { // Data voorbereiden om naar parent te sturen const formData = { naam: this.lokaleNaam, email: this.lokaalEmail } // Event emitteren naar parent component this.$emit('opVerzenden', formData) }, annuleren() { // Event emitteren zonder data this.$emit('opAnnuleren') } } } </script> <style scoped> .gebruikersprofiel { border: 1px solid #ccc; padding: 20px; border-radius: 8px; } .knoppen { margin-top: 20px; display: flex; gap: 10px; } button { padding: 10px 15px; border: none; border-radius: 4px; cursor: pointer; } button[type="submit"] { background-color: #4CAF50; color: white; } button[type="button"] { background-color: #f44336; color: white; } </style> ``` ## 2. Geavanceerde Prop Validatie ```javascript props: { titel: { type: String, required: true, validator: (value) => { return value.length > 0 && value.length <= 50 } }, beschrijving: { type: String, default: 'Geen beschrijving beschikbaar', validator: (value) => { return value.length <= 200 } } } ``` ## 3. Gebruik in Parent Component ```vue <template> <div> <Gebruikersprofiel :titel="profielTitel" :beschrijving="profielBeschrijving" @opVerzenden="verwerkVerzending" @opAnnuleren="verwerkAnnulering" /> </div> </template> <script> import Gebruikersprofiel from './components/Gebruikersprofiel.vue' export default { components: { Gebruikersprofiel }, data() { return { profielTitel: 'Mijn Gebruikersprofiel', profielBeschrijving: 'Vul je profielgegevens in' } }, methods: { verwerkVerzending(formData) { console.log('Ontvangen data:', formData) // Verwerk de ontvangen data // Bijvoorbeeld: API call, state update, etc. }, verwerkAnnulering() { console.log('Actie geannuleerd') // Reset formulier of navigeer terug } } } </script> ``` ## 4. Alternatieve Composition API Syntax (Vue 3) ```vue <script setup> import { defineProps, defineEmits, ref } from 'vue' // Props definiëren const props = defineProps({ titel: { type: String, required: true }, beschrijving: { type: String, default: 'Standaard beschrijving' } }) // Events definiëren const emit = defineEmits(['opVerzenden', 'opAnnuleren']) const lokaleNaam = ref('') const lokaalEmail = ref('') const verzenden = () => { emit('opVerzenden', { naam: lokaleNaam.value, email: lokaalEmail.value }) } const annuleren = () => { emit('opAnnuleren') } </script> ``` ## Belangrijke Punten: 1. **Props**: Gebruik `props` om data van parent naar child te sturen 2. **Events**: Gebruik `$emit()` om van child naar parent te communiceren 3. **Validatie**: Valideer props voor betrouwbaardere componenten 4. **Scoped Styles**: Gebruik `scoped` om styling te isoleren 5. **Default Values**: Geef standaardwaarden voor optionele props Dit component kan nu herbruikt worden met verschillende titels en beschrijvingen, en communiceert via events terug naar de parent component.