En aquest tema, explorarem com els components de Vue.js poden comunicar-se entre ells. La comunicació entre components és essencial per construir aplicacions complexes i ben organitzades. Aprendrem sobre les diferents maneres de passar dades i esdeveniments entre components pare i fill, així com entre components germans.
Objectius d'aprenentatge
- Entendre com passar dades dels components pare als components fill utilitzant
props. - Aprendre a emetre esdeveniments des dels components fill als components pare.
- Explorar la comunicació entre components germans utilitzant un bus d'esdeveniments o un estat global.
- Passar dades amb
props
propsQuè són les props?
Les props (abreviatura de "properties") són una manera de passar dades dels components pare als components fill. Les props permeten que els components fill siguin reutilitzables i configurables.
Exemple de props
<!-- Component Pare -->
<template>
<div>
<h1>Comunicació entre components</h1>
<ChildComponent message="Hola des del component pare!" />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
}
};
</script><!-- Component Fill (ChildComponent.vue) -->
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
props: {
message: {
type: String,
required: true
}
}
};
</script>Explicació
- Component Pare: Passa una
propanomenadamessagealChildComponent. - Component Fill: Declara la
propmessagei la mostra en el seu template.
- Emetre esdeveniments
Què són els esdeveniments personalitzats?
Els esdeveniments personalitzats permeten que els components fill enviïn informació als components pare. Això es fa mitjançant l'emissió d'esdeveniments des del component fill i la captura d'aquests esdeveniments en el component pare.
Exemple d'esdeveniments personalitzats
<!-- Component Pare -->
<template>
<div>
<h1>Comunicació entre components</h1>
<ChildComponent @custom-event="handleCustomEvent" />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
methods: {
handleCustomEvent(data) {
console.log('Esdeveniment rebut:', data);
}
}
};
</script><!-- Component Fill (ChildComponent.vue) -->
<template>
<div>
<button @click="emitEvent">Emet esdeveniment</button>
</div>
</template>
<script>
export default {
methods: {
emitEvent() {
this.$emit('custom-event', 'Hola des del component fill!');
}
}
};
</script>Explicació
- Component Pare: Escolta l'esdeveniment
custom-eventi executa el mètodehandleCustomEventquan l'esdeveniment és emès. - Component Fill: Emet l'esdeveniment
custom-eventamb un missatge quan es fa clic al botó.
- Comunicació entre components germans
Utilitzant un bus d'esdeveniments
Un bus d'esdeveniments és una instància de Vue que s'utilitza per emetre i escoltar esdeveniments entre components que no tenen una relació pare-fill.
Exemple de bus d'esdeveniments
<!-- Component A -->
<template>
<div>
<button @click="sendMessage">Envia missatge a Component B</button>
</div>
</template>
<script>
import { EventBus } from './eventBus';
export default {
methods: {
sendMessage() {
EventBus.$emit('message', 'Hola des del Component A!');
}
}
};
</script><!-- Component B -->
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script>
import { EventBus } from './eventBus';
export default {
data() {
return {
message: ''
};
},
created() {
EventBus.$on('message', (data) => {
this.message = data;
});
}
};
</script>Explicació
- eventBus.js: Crea una instància de Vue que actua com a bus d'esdeveniments.
- Component A: Emet un esdeveniment
messageamb un missatge. - Component B: Escolta l'esdeveniment
messagei actualitza la seva dadamessageamb el missatge rebut.
Exercicis pràctics
Exercici 1: Passar dades amb props
Crea dos components, ParentComponent i ChildComponent. Passa una prop anomenada title des del ParentComponent al ChildComponent i mostra-la en el ChildComponent.
Solució
<!-- ParentComponent.vue -->
<template>
<div>
<ChildComponent title="Títol des del component pare" />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
}
};
</script><!-- ChildComponent.vue -->
<template>
<div>
<h2>{{ title }}</h2>
</div>
</template>
<script>
export default {
props: {
title: {
type: String,
required: true
}
}
};
</script>Exercici 2: Emetre esdeveniments
Crea dos components, ParentComponent i ChildComponent. Emet un esdeveniment des del ChildComponent amb un missatge i captura'l en el ParentComponent.
Solució
<!-- ParentComponent.vue -->
<template>
<div>
<ChildComponent @custom-event="handleEvent" />
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
},
methods: {
handleEvent(message) {
console.log('Missatge rebut:', message);
}
}
};
</script><!-- ChildComponent.vue -->
<template>
<div>
<button @click="emitEvent">Emet esdeveniment</button>
</div>
</template>
<script>
export default {
methods: {
emitEvent() {
this.$emit('custom-event', 'Hola des del component fill!');
}
}
};
</script>Conclusió
En aquesta secció, hem après com els components de Vue.js poden comunicar-se entre ells utilitzant props i esdeveniments personalitzats. També hem explorat com els components germans poden comunicar-se utilitzant un bus d'esdeveniments. Aquests conceptes són fonamentals per construir aplicacions Vue.js ben estructurades i escalables. En el següent mòdul, aprofundirem en l'ús de Vue Router per gestionar la navegació en les nostres aplicacions.
Curs de Vue.js
Mòdul 1: Introducció a Vue.js
- Què és Vue.js?
- Configuració de l'entorn de desenvolupament
- Creant la teva primera aplicació Vue
- Entenent la instància de Vue
Mòdul 2: Conceptes bàsics de Vue.js
- Sintaxi de plantilles
- Enllaç de dades
- Propietats computades i observadors
- Enllaços de classes i estils
- Renderització condicional
- Renderització de llistes
Mòdul 3: Components de Vue.js
- Introducció als components
- Props i esdeveniments personalitzats
- Slots
- Components dinàmics i asíncrons
- Comunicació entre components
Mòdul 4: Vue Router
- Introducció a Vue Router
- Configuració de Vue Router
- Rutes dinàmiques
- Rutes niades
- Guàrdies de navegació
Mòdul 5: Gestió d'estat amb Vuex
- Introducció a Vuex
- Estat, getters, mutacions i accions
- Mòduls a Vuex
- Utilitzant Vuex en components
- Patrons avançats de Vuex
Mòdul 6: Directives de Vue.js
Mòdul 7: Plugins de Vue.js
Mòdul 8: Proves en Vue.js
Mòdul 9: Conceptes avançats de Vue.js
- Funcions de renderització i JSX
- Renderització del costat del servidor (SSR) amb Nuxt.js
- API de composició de Vue 3
- Optimització del rendiment
