En Vue.js, los slots son una poderosa característica que permite a los desarrolladores crear componentes más flexibles y reutilizables. Los slots permiten que los componentes padres inserten contenido en los componentes hijos, lo que facilita la creación de interfaces de usuario dinámicas y personalizables.
Conceptos Clave
- Slot Básico: Permite insertar contenido en un componente hijo desde el componente padre.
- Slot Nombrado: Permite definir múltiples áreas de contenido en un componente hijo, cada una con un nombre específico.
- Slot Scoped: Permite pasar datos del componente hijo al contenido del slot en el componente padre.
Slot Básico
Ejemplo
<!-- Componente Hijo: MyComponent.vue -->
<template>
<div class="my-component">
<slot></slot>
</div>
</template>
<script>
export default {
name: 'MyComponent'
}
</script><!-- Componente Padre -->
<template>
<div>
<my-component>
<p>Este es el contenido del slot básico.</p>
</my-component>
</div>
</template>
<script>
import MyComponent from './MyComponent.vue';
export default {
components: {
MyComponent
}
}
</script>Explicación
- En
MyComponent.vue, el<slot></slot>actúa como un marcador de posición para el contenido que se insertará desde el componente padre. - En el componente padre, el contenido dentro de
<my-component>se inserta en el slot del componente hijo.
Slot Nombrado
Ejemplo
<!-- Componente Hijo: MyComponent.vue -->
<template>
<div class="my-component">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template>
<script>
export default {
name: 'MyComponent'
}
</script><!-- Componente Padre -->
<template>
<div>
<my-component>
<template v-slot:header>
<h1>Encabezado</h1>
</template>
<p>Este es el contenido principal.</p>
<template v-slot:footer>
<p>Pie de página</p>
</template>
</my-component>
</div>
</template>
<script>
import MyComponent from './MyComponent.vue';
export default {
components: {
MyComponent
}
}
</script>Explicación
- En
MyComponent.vue, se definen tres slots: uno sin nombre (contenido principal), uno para el encabezado (name="header") y uno para el pie de página (name="footer"). - En el componente padre, se utiliza la directiva
v-slotpara especificar el contenido de cada slot nombrado.
Slot Scoped
Ejemplo
<!-- Componente Hijo: MyComponent.vue -->
<template>
<div class="my-component">
<slot :user="user"></slot>
</div>
</template>
<script>
export default {
name: 'MyComponent',
data() {
return {
user: {
name: 'John Doe',
age: 30
}
}
}
}
</script><!-- Componente Padre -->
<template>
<div>
<my-component v-slot:default="slotProps">
<p>Nombre: {{ slotProps.user.name }}</p>
<p>Edad: {{ slotProps.user.age }}</p>
</my-component>
</div>
</template>
<script>
import MyComponent from './MyComponent.vue';
export default {
components: {
MyComponent
}
}
</script>Explicación
- En
MyComponent.vue, el slot se define con un objetouserque se pasa como propiedad del slot (:user="user"). - En el componente padre, se utiliza
v-slot:default="slotProps"para acceder a las propiedades del slot y utilizarlas en el contenido del slot.
Ejercicio Práctico
Ejercicio
Crea un componente Card que tenga tres slots nombrados: header, content y footer. Usa este componente en un componente padre para mostrar una tarjeta con un encabezado, contenido principal y pie de página.
Solución
<!-- Componente Hijo: Card.vue -->
<template>
<div class="card">
<header>
<slot name="header"></slot>
</header>
<main>
<slot name="content"></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template>
<script>
export default {
name: 'Card'
}
</script>
<style>
.card {
border: 1px solid #ccc;
padding: 16px;
border-radius: 8px;
}
header, footer {
background-color: #f9f9f9;
padding: 8px;
}
</style><!-- Componente Padre -->
<template>
<div>
<card>
<template v-slot:header>
<h2>Encabezado de la Tarjeta</h2>
</template>
<template v-slot:content>
<p>Este es el contenido principal de la tarjeta.</p>
</template>
<template v-slot:footer>
<p>Pie de página de la tarjeta</p>
</template>
</card>
</div>
</template>
<script>
import Card from './Card.vue';
export default {
components: {
Card
}
}
</script>Explicación
- El componente
Carddefine tres slots nombrados:header,contentyfooter. - En el componente padre, se utiliza
v-slotpara insertar contenido en cada uno de los slots nombrados del componenteCard.
Conclusión
Los slots en Vue.js son una herramienta esencial para crear componentes flexibles y reutilizables. Permiten a los desarrolladores insertar contenido dinámico en componentes hijos desde componentes padres, lo que facilita la creación de interfaces de usuario complejas y personalizables. Con la comprensión de los slots básicos, nombrados y scoped, puedes construir componentes más robustos y adaptables en tus aplicaciones Vue.js.
Curso de Vue.js
Módulo 1: Introducción a Vue.js
- ¿Qué es Vue.js?
- Configuración del Entorno de Desarrollo
- Creando Tu Primera Aplicación Vue
- Entendiendo la Instancia de Vue
Módulo 2: Conceptos Básicos de Vue.js
- Sintaxis de Plantillas
- Vinculación de Datos
- Propiedades Computadas y Observadores
- Vinculación de Clases y Estilos
- Renderizado Condicional
- Renderizado de Listas
Módulo 3: Componentes de Vue.js
- Introducción a los Componentes
- Props y Eventos Personalizados
- Slots
- Componentes Dinámicos y Asíncronos
- Comunicación entre Componentes
Módulo 4: Vue Router
- Introducción a Vue Router
- Configuración de Vue Router
- Rutas Dinámicas
- Rutas Anidadas
- Guardias de Navegación
Módulo 5: Gestión de Estado con Vuex
- Introducción a Vuex
- Estado, Getters, Mutaciones y Acciones
- Módulos en Vuex
- Usando Vuex en Componentes
- Patrones Avanzados de Vuex
Módulo 6: Directivas de Vue.js
Módulo 7: Plugins de Vue.js
Módulo 8: Pruebas en Vue.js
- Pruebas Unitarias con Vue Test Utils
- Pruebas de Extremo a Extremo con Cypress
- Simulación de Dependencias
Módulo 9: Conceptos Avanzados de Vue.js
- Funciones de Renderizado y JSX
- Renderizado del Lado del Servidor (SSR) con Nuxt.js
- API de Composición de Vue 3
- Optimización del Rendimiento
Módulo 10: Construcción y Despliegue de Aplicaciones Vue.js
- Construcción para Producción
- Despliegue de Aplicaciones Vue.js
- Integración y Despliegue Continuos (CI/CD)
