Slots (parte 2 de 2)

Un componente de Svelte no tiene por qué tener un único slot para introducir descendencia, sino que podremos fabricar componentes donde haya varios slots, aunque en ese caso existen algunas restricciones a tener en cuenta: que cada slot tenga un nombre único, y que cada slot vaya asociado con un nodo DOM diferente. También en este vídeo, la noción de los fragmentos.

Este curso ha sido marcado como anticuado y no está siendo revisado de forma activa. Es posible que la información pueda estar desactualizada o que los enlaces se hayan roto.

Cuando trabajamos con componentes en Svelte, no estamos limitados a tener un único slot para insertar contenido externo. Podemos definir múltiples slots dentro de un mismo componente, lo que nos permite crear estructuras más complejas y flexibles. Sin embargo, para que esto funcione correctamente, es necesario asignar un nombre a cada slot mediante el atributo name. Esto es fundamental porque, sin nombres, Svelte no podría distinguir a qué slot corresponde cada fragmento de contenido que queremos insertar.

Imaginemos que queremos que nuestro componente tenga una cabecera y un cuerpo, cada uno con contenido personalizado. En lugar de usar un solo slot para todo, podemos definir un slot llamado header para la cabecera y otro llamado main para el cuerpo. Si no se proporciona contenido para alguno de estos slots, podemos definir un contenido por defecto, como un simple título con una etiqueta h1.

Para asociar contenido externo a estos slots nombrados, utilizamos el atributo slot en las etiquetas que queremos insertar. Por ejemplo, si tenemos un párrafo que queremos que se inserte en el slot main, lo escribiremos así:

<p slot="main">Contenido para el slot principal</p>

Es importante entender que el elemento que recibe el atributo slot se inserta tal cual en el lugar del slot correspondiente, incluyendo su propia etiqueta HTML. Esto significa que si ponemos un strong con slot="header", ese strong aparecerá en el slot header con su etiqueta intacta. Por ejemplo:

<h1 slot="header">Título principal</h1>
<strong slot="header">Texto destacado</strong>

En este caso, el contenido del slot header será reemplazado por el elemento que hayamos definido con el atributo slot="header".

Un detalle importante es que cada slot nombrado solo puede tener un único elemento raíz. No podemos asignar varios elementos hermanos directamente a un mismo slot, ya que esto generaría un error. Para solucionar esto, podemos envolver esos elementos en un contenedor, como un div, y asignarle el atributo slot a ese contenedor. Por ejemplo:

<div slot="main">
  <p>Chopitos</p>
  <p>Pescado</p>
  <p>Fruta</p>
</div>

Esto asegura que el slot main reciba un único elemento raíz, que a su vez contiene varios elementos hijos.

Sin embargo, en algunos casos, añadir un contenedor extra como un div puede romper la maquetación o afectar el estilo de nuestra aplicación, ya que introduce un nodo adicional en el DOM. Para evitar esto, Svelte nos ofrece una solución muy útil: la etiqueta especial <svelte:fragment>. Esta etiqueta actúa como un contenedor invisible que no genera un nodo extra en el DOM, pero nos permite agrupar varios elementos para asignarlos a un slot nombrado.

Así, si queremos insertar varios párrafos en un slot sin añadir un contenedor visible, podemos hacerlo de la siguiente manera:

<svelte:fragment slot="main">
  <p>Chopitos</p>
  <p>Pescado</p>
  <p>Fruta</p>
</svelte:fragment>

Con esto, el contenido se insertará directamente en el slot main sin añadir etiquetas adicionales que puedan interferir con la maquetación.

En resumen, el uso de múltiples slots nombrados en Svelte nos permite crear componentes mucho más flexibles y personalizados, controlando exactamente dónde y cómo se inserta cada fragmento de contenido. Además, con la ayuda de <svelte:fragment>, podemos evitar problemas de maquetación derivados de contenedores innecesarios, manteniendo nuestra estructura limpia y funcional.

Lista de reproducción
  1. 1
    ¿Qué es Svelte?
    9 minutos
  2. 2
    ¿Cómo crear un proyecto de Svelte?
    7 minutos
  3. 3
    Creando nuestro primer componente
    7 minutos
  4. 4
    Datos dinámicos y props
    7 minutos
  5. 5
    Anidando componentes
    7 minutos
  6. 6
    Capturando eventos
    7 minutos
  7. 7
    Eventos y reactividad
    8 minutos
  8. 8
    Atributos condicionales e IF
    9 minutos
  9. 9
    Bucles
    11 minutos
  10. 10
    Bloques await
    7 minutos
  11. 11
    Bind
    8 minutos
  12. 12
    bind:this
    6 minutos
  13. 13
    ¿Para qué nos sirve un evento personalizado?
    6 minutos
  14. 14
    createEventDispatcher
    6 minutos
  15. 15
    Eventos con detalles
    7 minutos
  16. 16
    Reenviando eventos
    6 minutos
  17. 17
    Ejemplo de eventos (primera parte)
    12 minutos
  18. 18
    Ejemplo de eventos (y segunda parte)
    16 minutos
  19. 19
    Modificadores de eventos
    6 minutos
  20. 20
    Fundamentos del CSS con Svelte
    9 minutos
  21. 21
    Clases condicionales
    7 minutos
  22. 22
    Estilos en línea y variables CSS
    8 minutos
  23. 23
    Estilos globales
    6 minutos
  24. 24
    Importar hojas de estilo externas
    5 minutos
  25. 25
    Reactividad experta con el operador $
    8 minutos
  26. 26
    Slots (parte 1 de 2)
    5 minutos
  27. 27
    Slots (parte 2 de 2)
    7 minutos
  28. 28
    Directivas svelte:window, svelte:head, svelte:body
    4 minutos
  29. 29
    Actualizar de Rollbar a Vite 3
    11 minutos
  30. 30
    Exportar a Web Components
    10 minutos
  31. 31
    Integrar TypeScript, SCSS, PostCSS...
    8 minutos
  32. 32
    Hasta aquí (por ahora)
    3 minutos
  33. 33
    Lo que se viene con Svelte 5
    13 minutos