Els slots són una característica poderosa de Vue.js que permet als desenvolupadors crear components més flexibles i reutilitzables. Els slots permeten inserir contingut dinàmicament en un component des de l'exterior, proporcionant una manera de personalitzar el contingut d'un component sense modificar el seu codi intern.
Conceptes Clau
- Slot Bàsic: Permet inserir contingut en un component.
- Slot Nombrat: Permet definir múltiples àrees dins d'un component on es pot inserir contingut.
- Slot per Defecte: Contingut que es mostra si no es proporciona cap contingut per al slot.
- Slot Scoped: Permet passar dades del component fill al component pare.
Slot Bàsic
Exemple
<!-- Component Pare -->
<template>
<div>
<h1>Component Pare</h1>
<child-component>
<p>Aquest és el contingut del slot bàsic.</p>
</child-component>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
}
};
</script>
<!-- Component Fill (ChildComponent.vue) -->
<template>
<div>
<h2>Component Fill</h2>
<slot></slot>
</div>
</template>
<script>
export default {
name: 'ChildComponent'
};
</script>Explicació
- El component pare (
ParentComponent) inclou el component fill (ChildComponent) i proporciona contingut per al slot. - El component fill (
ChildComponent) utilitza la directiva<slot></slot>per indicar on s'ha d'inserir el contingut proporcionat pel component pare.
Slot Nombrat
Exemple
<!-- Component Pare -->
<template>
<div>
<h1>Component Pare</h1>
<child-component>
<template v-slot:header>
<h2>Aquest és el contingut del slot "header".</h2>
</template>
<template v-slot:footer>
<p>Aquest és el contingut del slot "footer".</p>
</template>
</child-component>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
}
};
</script>
<!-- Component Fill (ChildComponent.vue) -->
<template>
<div>
<header>
<slot name="header"></slot>
</header>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template>
<script>
export default {
name: 'ChildComponent'
};
</script>Explicació
- El component pare utilitza
v-slot:headeriv-slot:footerper proporcionar contingut específic per als slots nombrats "header" i "footer". - El component fill defineix on s'han d'inserir aquests continguts amb
<slot name="header"></slot>i<slot name="footer"></slot>.
Slot per Defecte
Exemple
<!-- Component Pare -->
<template>
<div>
<h1>Component Pare</h1>
<child-component></child-component>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
}
};
</script>
<!-- Component Fill (ChildComponent.vue) -->
<template>
<div>
<h2>Component Fill</h2>
<slot>
<p>Aquest és el contingut per defecte del slot.</p>
</slot>
</div>
</template>
<script>
export default {
name: 'ChildComponent'
};
</script>Explicació
- Si el component pare no proporciona cap contingut per al slot, es mostrarà el contingut per defecte definit dins del component fill.
Slot Scoped
Exemple
<!-- Component Pare -->
<template>
<div>
<h1>Component Pare</h1>
<child-component>
<template v-slot:default="slotProps">
<p>El valor del slot és: {{ slotProps.value }}</p>
</template>
</child-component>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: {
ChildComponent
}
};
</script>
<!-- Component Fill (ChildComponent.vue) -->
<template>
<div>
<h2>Component Fill</h2>
<slot :value="dataValue"></slot>
</div>
</template>
<script>
export default {
name: 'ChildComponent',
data() {
return {
dataValue: 'Hola des del component fill!'
};
}
};
</script>Explicació
- El component fill passa dades al component pare mitjançant l'atribut
:valueen el slot. - El component pare accedeix a aquestes dades utilitzant
slotProps.value.
Exercicis Pràctics
Exercici 1: Slot Bàsic
Crea un component Card que utilitzi un slot bàsic per inserir contingut dinàmicament.
Solució
<!-- Card.vue -->
<template>
<div class="card">
<slot></slot>
</div>
</template>
<script>
export default {
name: 'Card'
};
</script>
<!-- App.vue -->
<template>
<div>
<Card>
<p>Aquest és el contingut de la targeta.</p>
</Card>
</div>
</template>
<script>
import Card from './Card.vue';
export default {
components: {
Card
}
};
</script>Exercici 2: Slot Nombrat
Crea un component Layout que utilitzi slots nombrats per definir una capçalera i un peu de pàgina.
Solució
<!-- Layout.vue -->
<template>
<div>
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template>
<script>
export default {
name: 'Layout'
};
</script>
<!-- App.vue -->
<template>
<div>
<Layout>
<template v-slot:header>
<h1>Capçalera del lloc web</h1>
</template>
<template v-slot:footer>
<p>Peu de pàgina del lloc web</p>
</template>
<p>Contingut principal del lloc web</p>
</Layout>
</div>
</template>
<script>
import Layout from './Layout.vue';
export default {
components: {
Layout
}
};
</script>Conclusió
Els slots són una eina essencial per crear components Vue.js flexibles i reutilitzables. Permeten inserir contingut dinàmicament, definir múltiples àrees de contingut i passar dades entre components. Amb la pràctica, els slots poden millorar significativament la modularitat i la mantenibilitat del teu codi Vue.js.
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
