Zum Inhalt springen

Shadow DOM-Slots, Komposition

Willkommen zu unserem umfassenden Leitfaden zur Beherrschung von Slots und Komposition im JavaScript Shadow DOM. Die Grundlagen des Shadow DOM werden in unserem vorherigen Artikel Shadow DOM beschrieben. In diesem Artikel werden wir untersuchen, wie Sie Slots und Komposition nutzen können, um die Flexibilität, Modularität und Wiederverwendbarkeit von Webkomponenten zu verbessern. Tauchen wir tief in diese fortgeschrittenen Konzepte ein und entdecken Sie, wie sie Ihre Webentwicklungsfähigkeiten auf das nächste Level heben können.

Understanding Slots in Shadow DOM

Slots sind Platzhalter innerhalb der Vorlage einer Webkomponente, die das dynamische Einfügen von Inhalten aus der übergeordneten Komponente oder externen Quellen ermöglichen. Sie bieten einen leistungsstarken Mechanismus zum Erstellen anpassbarer und wiederverwendbarer Komponenten. Lassen Sie uns untersuchen, wie Sie Slots im JavaScript Shadow DOM effektiv nutzen können.

Defining Slots

Um einen Slot innerhalb der Vorlage einer Webkomponente zu definieren, verwenden wir das <slot>-Element. Slots können standardmäßig (ohne name-Attribut) oder benannt sein. Betrachten wir ein einfaches Beispiel mit einem Standard-Slot:


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>

In diesem Beispiel dient das <slot>-Element als Platzhalter für Inhalte, die von der übergeordneten Komponente bereitgestellt werden. Das Weglassen des name-Attributs erstellt einen Standard-Slot, der alle Inhalte empfängt, die direkt innerhalb des benutzerdefinierten Elements ohne slot-Attribut platziert werden.

Distributing Content with Slots

Slots können Inhalte von der übergeordneten Komponente oder Fallback-Inhalte, die innerhalb des Slot-Elements selbst bereitgestellt werden, empfangen. Sehen wir uns an, wie die Slot-Verteilung funktioniert:


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>

In diesem Beispiel wird das <div>-Element mit dem Attribut slot="content" in den Slot mit dem Namen „content“ innerhalb des custom-element eingefügt und überschreibt dabei den Default content.

Enhancing Composition in Shadow DOM

Komposition bezieht sich im Kontext des Shadow DOM auf das Zusammensetzen von UI-Komponenten und Inhalten durch die Kombination von Slots und deren verteilten Inhalten, um komplexere, wiederverwendbare Strukturen zu erstellen. Wenn sie im Kontext des Shadow DOM angewendet wird, ermöglicht die Komposition die Erstellung hochgradig anpassbarer und wiederverwendbarer Webkomponenten.

Um Inhalte, die von der übergeordneten Komponente in Slots verteilt werden, zu stylen, verwenden Sie das CSS-Pseudo-Element ::slotted(). Beispiel: ::slotted(div) { color: blue; } wendet Stile auf den slotted <div> an.

Composing Components with Slots

Eine leistungsstarke Möglichkeit, Komposition im Shadow DOM zu nutzen, besteht darin, Komponenten durch die Verwendung von Slots zu kombinieren. Erstellen wir eine zusammengesetzte Komponente, die aus mehreren untergeordneten Komponenten besteht:


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>

In diesem Beispiel enthält die Vorlage der zusammengesetzten Komponente mehrere Slots für Header-, Inhalts- und Footer-Bereiche. Diese Slots können Inhalte aufnehmen, die von der übergeordneten Komponente bereitgestellt werden, und ermöglichen so eine flexible Komposition.

Conclusion

Die Beherrschung von Slots und Komposition im JavaScript Shadow DOM befähigt Entwickler, hochgradig anpassbare und wiederverwendbare Webkomponenten zu erstellen. Durch das Verständnis und die effektive Nutzung dieser fortgeschrittenen Techniken können Sie modulare, flexible und wartbare Anwendungen entwickeln. Experimentieren Sie mit den bereitgestellten Beispielen, erkunden Sie weitere Möglichkeiten und schalten Sie das volle Potenzial des Shadow DOM in Ihren Projekten frei. Viel Spaß beim Coden!

Practice

Wofür werden Slots im JavaScript Shadow DOM verwendet?

Finden Sie das nützlich?

Dual-run-Vorschau — vergleichen Sie mit den Symfony-Routen live.