Slots: HTML dinámico en componentes Vue
Clase 29 de 53 • Curso Profesional de Vue.js 2
Contenido del curso
CLI y Dev Tools
- 3

Instalación de Vue.js: Node, Dev Tools y CLI
06:13 min - 4

Crear una aplicación Vue con CLI y webpack
12:49 min - 5

Cómo funciona webpack.config.js
10:38 min - 6

Babel: transpilador de JavaScript moderno
05:06 min - 7

ESLint con Standard JS: linteo automático en webpack
15:34 min - 8

Configuración de Sass y Bulma en Vue
06:18 min - 9

Cómo configurar Pug en Vue con webpack
04:23 min - 10
Diseño de Mockups: Práctica y Colaboración en Comunidad
00:20 min - 11
Creación de Vistas con Mockups y Vue.js
00:32 min
Manipulación del DOM
- 12

Expresiones en Vue: sintaxis doble llave
03:49 min - 13

Diferencia entre v-show y v-if en el DOM
06:22 min - 14

Qué es data binding en Vue.js
04:11 min - 15

Computed properties en Vue.js: cómo crearlas
04:13 min - 16

Qué son los watchers de Vue
02:25 min - 17

Eventos Vue: directiva v-on y métodos format
06:12 min - 18

Cómo construir una interfaz de búsqueda completa en Vue
19:03 min - 19
Manipulación del DOM con Vue.js: Práctica y Ejercicios
03:00 min
REST y HTTP
Sistema de Componentes
- 23

Cómo crear componentes en Vue
08:46 min - 24

Componentes Layout en Vue con Bulma
09:50 min - 25

Reactividad en Vue: $set y Object.assign
06:14 min - 26

Hooks del ciclo de vida en Vue.js
05:38 min - 27

Comunicación padre-hijo con props en Vue
23:27 min - 28

Eventos en Vue: comunicar hijo a padre
12:04 min - 29

Slots: HTML dinámico en componentes Vue
Viendo ahora - 30

Plugin Event Bus: comunicar componentes sin relación en Vue
19:19 min
Vue Router
Extendiendo VueJS
Clases, Animaciones y Transiciones36
Vuex
- 39

Cómo Vuex centraliza estados en Vue
03:41 min - 40

Instalación de Vuex con estado único
17:32 min - 41

Cómo usar mutations y commit en Vuex
08:16 min - 42

Getters de Vuex: mapGetters y store sincronizado
07:35 min - 43

Cómo dispatch ejecuta actions asincrónicas en ViewX
07:54 min - 44

Instalación de Viewex en Platzi Music
26:37 min
Nuxt.js
Deploy a Producción con Now
Conclusiones
Bonus
Los slots son una forma clara y flexible de inyectar HTML dinámico desde el componente padre hacia el hijo, evitando sobrecargar con propiedades y lógica. Aquí verás cómo crear slots con nombre, cómo el contenido del padre tiene precedencia y cómo aplicarlo en una notificación que se muestra solo cuando no hay resultados en la API y se cierra automáticamente con watchers y setTimeout de JavaScript.
¿Qué es un slot y para qué sirve?
Un slot permite que un componente hijo defina áreas “vacías” que el padre puede rellenar con su propio HTML. Si el padre no provee contenido, el hijo puede mostrar un contenido por defecto. Esto es útil para títulos y cuerpos personalizados, y para componentes como modales con botones y textos variables.
¿Cómo se define un slot con nombre?
En el hijo se declaran slots con nombre para secciones específicas como “title” y “body”. Si el padre no los rellena, se muestran valores por defecto.
<!-- child-component -->
<div class="container">
<slot name="title">
<h1>Título por defecto</h1>
</slot>
<slot name="body">
<p>Cuerpo por defecto.</p>
</slot>
</div>
¿Cómo lo reemplaza el componente padre?
El padre inyecta HTML usando el atributo slot con el nombre correspondiente. El contenido del padre tiene precedencia sobre el del hijo.
<!-- app.view -->
<child-component>
<h1 slot="title">título desde el padre</h1>
<div slot="body">
<p>Lorem ipsum.</p>
<p>Otro párrafo.</p>
</div>
</child-component>
¿Cómo aplicar slots en una notificación con Bulma?
Se crea un componente de notificación con estructura Bulma, un slot “body” con texto por defecto y estilos en SCSS con alcance limitado.
<!-- share/notification.view -->
<div class="container">
<div class="columns">
<div class="column is-5 is-offset-4">
<div class="notification is-danger">
<slot name="body">algo anduvo mal.</slot>
</div>
</div>
</div>
</div>
<style lang="scss" scoped>
.notification {
margin: 10px;
}
</style>
Para usarlo e inyectar el mensaje desde el padre:
<!-- app.view -->
<pm-notification v-show="showNotification">
<p slot="body">no se encontraron resultados.</p>
</pm-notification>
¿Cómo mostrarlo solo cuando no hay resultados en la API?
Se define un booleano en data y se actualiza tras la búsqueda. Se usa comparación estricta en JavaScript.
// app.view
export default {
data() {
return { showNotification: false };
},
methods: {
async search() {
const res = await this.fetchTracks();
// total de resultados en res.tracks.total
this.showNotification = res.tracks.total === 0; // estricto: ===
}
}
};
- Variable booleana: showNotification en false al iniciar.
- Visibilidad con directiva: v-show en el componente de notificación.
- Decisión por datos: res.tracks.total === 0.
¿Cómo cerrarlo automáticamente con un watcher y setTimeout?
Un watcher observa showNotification y, si es true, programa su ocultamiento a los 3 segundos.
// app.view
export default {
watch: {
showNotification(val) {
if (!val) return; // evita bucles innecesarios
setTimeout(() => {
this.showNotification = false;
}, 3000);
}
}
};
- Lógica reactiva: el watcher se llama igual que la propiedad observada.
- Temporización: setTimeout con 3000 milisegundos.
- Prevención de loops: no actúa cuando es false.
¿Qué buenas prácticas y conceptos refuerza este patrón?
Los ejemplos consolidan habilidades esenciales para componentes reutilizables y mantenibles.
- Slots con nombre: title y body para secciones claras.
- Contenido por defecto: asegura mensajes útiles si el padre no define HTML.
- Precedencia del padre: reemplaza el contenido del hijo cuando hay slot.
- Estructura con Bulma: container, columns, column, notification, is-danger.
- Estilos con SCSS y scope: evita afectar otros componentes.
- Comparación estricta en JavaScript: uso de === para evaluar resultados de la API.
- Funciones flecha: arrow functions en callbacks concisos.
- Temporización con setTimeout: cierre automático tras 3 segundos.
- Reactividad con watchers: nombre idéntico a la propiedad observada.
- Importaciones con alias: uso de @ gracias a webpack para rutas claras.
- Flexibilidad de HTML: slots admiten múltiples elementos, no solo un tag.
- Uso típico: componentes como modales y notificaciones con títulos y cuerpos dinámicos.
¿Te gustaría ver variaciones de este patrón con diferentes estilos o reglas de negocio? Cuéntame qué caso necesitas resolver y lo armamos juntos.