Saltar al contenido

Ranuras y composición de Shadow DOM

Bienvenido a nuestra guía completa para dominar las ranuras (slots) y la composición en el Shadow DOM de JavaScript. Los fundamentos del Shadow DOM se describen en nuestro artículo anterior, Shadow DOM. En este artículo, exploraremos cómo aprovechar las ranuras y la composición para mejorar la flexibilidad, modularidad y reutilización de los componentes web. Sumérgete en profundidad en estos conceptos avanzados y descubre cómo pueden elevar tus habilidades de desarrollo web al siguiente nivel.

Comprender las ranuras (slots) en Shadow DOM

Las ranuras (slots) son marcadores de posición dentro de la plantilla de un componente web que permiten la inserción dinámica de contenido desde el padre del componente o fuentes externas. Proporcionan un mecanismo potente para componer componentes personalizables y reutilizables. Exploraremos cómo utilizar eficazmente las ranuras en el Shadow DOM de JavaScript.

Definir ranuras (slots)

Para definir una ranura dentro de la plantilla de un componente web, utilizamos el elemento <slot>. Las ranuras pueden ser predeterminadas (sin el atributo name) o con nombre. Consideremos un ejemplo simple con una ranura predeterminada:


html
<body>
  <script>
    class CustomElement extends HTMLElement {
      constructor() {
        super();
        const shadowRoot = this.attachShadow({ mode: 'open' });
        shadowRoot.innerHTML = `
          <div class="container">
            <slot>Default content</slot>
          </div>
        `;
      }
    }
    
    customElements.define('custom-element', CustomElement);
    
    // Displaying the custom element
    const customElement = document.createElement('custom-element');
    document.body.appendChild(customElement);
  </script>
</body>

En este ejemplo, el elemento <slot> actúa como un marcador de posición para el contenido proporcionado por el padre del componente. Omitir el atributo name crea una ranura predeterminada, la cual recibirá cualquier contenido colocado directamente dentro del elemento personalizado sin un atributo slot.

Distribuir contenido con ranuras (slots)

Las ranuras pueden recibir contenido del componente padre o contenido de respaldo proporcionado dentro del propio elemento de la ranura. Veamos cómo funciona la distribución de ranuras:


html
<body>
  <!-- Define Custom Element -->
  <script>
    // Define Custom Element Class
    class CustomElement extends HTMLElement {
      constructor() {
        super();
        const shadowRoot = this.attachShadow({ mode: 'open' });
        shadowRoot.innerHTML = `
          <style>
            /* Define styles for the component */
            .container {
              border: 1px solid #ccc;
              padding: 20px;
            }
          </style>
          <div class="container">
            <slot name="content">Default content</slot>
          </div>
        `;
      }
    }

    // Define Custom Element
    customElements.define('custom-element', CustomElement);
  </script>

  <!-- Displaying the custom element -->
  <custom-element>
    <div slot="content">Content from parent</div>
  </custom-element>
</body>

En este ejemplo, el elemento <div> con el atributo slot="content" se insertará en la ranura llamada "content" dentro del custom-element, sobrescribiendo el Default content.

Mejorar la composición en Shadow DOM

La composición en el contexto del Shadow DOM se refiere al ensamblaje de componentes de UI y contenido combinando ranuras y su contenido distribuido para crear estructuras más complejas y reutilizables. Cuando se aplica dentro del contexto del Shadow DOM, la composición permite la creación de componentes web altamente personalizables y reutilizables.

Para dar estilo al contenido distribuido en las ranuras desde el padre, utiliza el pseudo-elemento CSS ::slotted(). Por ejemplo, ::slotted(div) { color: blue; } aplica estilos al <div> insertado en la ranura.

Componer componentes con ranuras (slots)

Una forma potente de aprovechar la composición en el Shadow DOM es combinar componentes utilizando ranuras. Creemos un componente compuesto que conste de múltiples componentes hijos:


html
<body>
  <script>
    // Define Composite Element Class
    class CompositeElement extends HTMLElement {
      constructor() {
        super();
        const shadowRoot = this.attachShadow({ mode: 'open' });
        shadowRoot.innerHTML = `
          <style>
            /* Define styles for the composite component */
            .container {
              border: 1px solid #ccc;
              padding: 20px;
            }
          </style>
          <div class="container">
            <slot name="header"></slot>
            <slot name="content"></slot>
            <slot name="footer"></slot>
          </div>
        `;
      }
    }

    // Define Composite Element
    customElements.define('composite-element', CompositeElement);
  </script>
  <composite-element>
    <div slot="header">Header</div>
    <div slot="content">Content</div>
    <div slot="footer">Footer</div>
  </composite-element>
</body>

En este ejemplo, la plantilla del componente compuesto contiene múltiples ranuras para las secciones de encabezado, contenido y pie de página. Estas ranuras pueden acomodar el contenido proporcionado por el componente padre, lo que permite una composición flexible.

Conclusión

Dominar las ranuras y la composición en el Shadow DOM de JavaScript permite a los desarrolladores crear componentes web altamente personalizables y reutilizables. Al comprender y aprovechar eficazmente estas técnicas avanzadas, puedes construir aplicaciones modulares, flexibles y mantenibles. Experimenta con los ejemplos proporcionados, explora más posibilidades y desbloquea todo el potencial del Shadow DOM en tus proyectos. ¡Feliz programación!

Práctica

¿Para qué se utilizan las ranuras (slots) en el Shadow DOM de JavaScript?

¿Te resulta útil?

Vista previa dual-run — compárala con las rutas Symfony en producción.