Im fünften Teil der Vue.js-Reihe haben wir die Props-Übergabe vorgestellt, die sich aber nur für einfache Übergaben eignet. Slots hingegen injizieren ganze UI-Elemente in Child-Komponenten, wie dieser Beitrag zeigt.
Die Übergabe komplexerer UI-Elemente lässt sich in Vue.js über Slots realisieren.
Mithilfe der Props-Übergabe von Parent- an Child-Komponenten lassen sich bis zu einem gewissen Grad auch Unterschiede in der Darstellung, also am Content von Komponenten konfigurieren. Einer Komponente, die beispielsweise einen Textbereich enthält, könnte so mitgeteilt werden, aus wie vielen Zeilen die Text Area bestehen soll. Das folgende Codestück demonstriert das an einer einfachen Child-Komponente:
Für einfache Fälle mag das genügen. Hat man aber komplexe UI-Komponenten in der Child-Komponente (zum Beispiel aus der Vuetify-Bibliothek), müssten sehr viele Props übergeben werden. Und noch flexiblere Komponenten, deren Inhalt in Form von HTML-Elementen oder anderen Vue-Komponenten komplett von der Parent-Komponente definiert werden sollen, sind so gleich gar nicht machbar.
Hilfreich wäre eine Möglichkeit, einer Komponente Content zu übergeben – eine Art Schacht in der Komponente, in den ein Fragment hineingeworfen werden kann. Der naheliegende Ansatz, den darzustellenden Content zwischen öffnendem und schließendem Tag der Child-Komponente im Parent-Template anzugeben, funktioniert erst einmal nicht. Der Inhalt (hier der Text „Neuer Content“) wird einfach durch das Template der Child-Komponente ersetzt:
An dieser Stelle haben nun Slots ihren großen Auftritt. Definiert man innerhalb des Template der Child-Komponente einen Slot mithilfe des slot-Elements, ermöglicht dieser exakt das gewünschte Verhalten: Der im Parent-Template zwischen öffnendem und schließendem Child-Komponenten-Tag angegebene Content wird in der Child-Komponente anstelle des Slots gerendert:
Dabei angegebene Handler-Methoden wie hier für das Click-Event werden dabei übrigens in der Parent-Komponente gesucht (alles im Parent-Template wird auch im Parent-Scope kompiliert).
Slots mit Fallback-Content
Es gibt Fälle, in denen es der Parent-Komponente unmöglich ist, den Slot zu füllen. Denkbar ist zum Beispiel eine Child-Komponente mit einem Slot, in dem Daten auf verschiedene Art visualisiert werden (Tabellen, Charts usw.). Was ist aber, wenn gar keine Daten vorliegen? In diesen Fällen kann es hilfreich sein, einen Platzhalter anzuzeigen. Dies geschieht durch Angabe eines Default-Content zwischen öffnendem und schließenden slot-Element:
Wird der Slot nun nicht gefüllt, ist hier der Text „Keine Daten verfügbar” zu sehen.
Den Slot beim Namen nennen
Mit den oben beschriebenen einfachen Slots lässt sich nur ein Bereich in der Child-Komponente befüllen. Oft hat man aber den Fall, dass es davon mehrere gibt. Glücklicherweise lassen sich Slots benamen. Dies geschieht mit dem name-Attribut:
Das Ansprechen der Slots in der Parent-Komponente erfolgt mithilfe des Template-Elements und einer Direktive namens v-slot:
<template> <h1>In Parent</h1> <Child> <template v-slot:slot1> Content für Slot 1 </template> <template v-slot:slot2> Content für Slot 2 </template> </Child> </template>
Nicht benamte Slots haben übrigens intern auch einen Namen, sie heißen ‚default‘.
Scoped Slots & Slot-Props
Neben den Named-Slots gibt es Slots noch in einer weiteren spannenden Geschmacksrichtung: Die Scoped-Slots. Sie ermöglichen dem Slot-Content in der Parent-Komponente auf Daten der Child-Komponente zuzugreifen. Dies geschieht durch Übergabe von Properties aus der Child-Komponente in den Slot, wo sie von der Parent-Komponente erreichbar sind.
Klingt zunächst einmal kompliziert, man versteht das am besten anhand eines Beispiels. In der folgenden Child-Komponte wird eine Property myText mit einem String-Inhalt definiert. Mithilfe eines Attribute-Bindings werden die Daten über den Slot als Slot-Prop mit Namen myProp an die Parent-Komponente übergeben:
Die Parent-Komponente bekommt im Template-Element die Slot-Props durch das v-slot-Attribut bekannt gemacht und kann anschließend auf sämtliche Slot-Props, darunter myProp, zugreifen:
In Summe handelt es sich also um eine Art umgekehrte Property-Übergabe vom Child an den Parent. Nicht ganz einfach, aber durchaus nützlich.
Stand: 08.12.2025
Es ist für uns eine Selbstverständlichkeit, dass wir verantwortungsvoll mit Ihren personenbezogenen Daten umgehen. Sofern wir personenbezogene Daten von Ihnen erheben, verarbeiten wir diese unter Beachtung der geltenden Datenschutzvorschriften. Detaillierte Informationen finden Sie in unserer Datenschutzerklärung.
Einwilligung in die Verwendung von Daten zu Werbezwecken
Ich bin damit einverstanden, dass die Vogel IT-Medien GmbH, Max-Josef-Metzger-Straße 21, 86157 Augsburg, einschließlich aller mit ihr im Sinne der §§ 15 ff. AktG verbundenen Unternehmen (im weiteren: Vogel Communications Group) meine E-Mail-Adresse für die Zusendung von Newslettern und Werbung nutzt. Auflistungen der jeweils zugehörigen Unternehmen können hier abgerufen werden.
Der Newsletterinhalt erstreckt sich dabei auf Produkte und Dienstleistungen aller zuvor genannten Unternehmen, darunter beispielsweise Fachzeitschriften und Fachbücher, Veranstaltungen und Messen sowie veranstaltungsbezogene Produkte und Dienstleistungen, Print- und Digital-Mediaangebote und Services wie weitere (redaktionelle) Newsletter, Gewinnspiele, Lead-Kampagnen, Marktforschung im Online- und Offline-Bereich, fachspezifische Webportale und E-Learning-Angebote. Wenn auch meine persönliche Telefonnummer erhoben wurde, darf diese für die Unterbreitung von Angeboten der vorgenannten Produkte und Dienstleistungen der vorgenannten Unternehmen und Marktforschung genutzt werden.
Meine Einwilligung umfasst zudem die Verarbeitung meiner E-Mail-Adresse und Telefonnummer für den Datenabgleich zu Marketingzwecken mit ausgewählten Werbepartnern wie z.B. LinkedIN, Google und Meta. Hierfür darf die Vogel Communications Group die genannten Daten gehasht an Werbepartner übermitteln, die diese Daten dann nutzen, um feststellen zu können, ob ich ebenfalls Mitglied auf den besagten Werbepartnerportalen bin. Die Vogel Communications Group nutzt diese Funktion zu Zwecken des Retargeting (Upselling, Crossselling und Kundenbindung), der Generierung von sog. Lookalike Audiences zur Neukundengewinnung und als Ausschlussgrundlage für laufende Werbekampagnen. Weitere Informationen kann ich dem Abschnitt „Datenabgleich zu Marketingzwecken“ in der Datenschutzerklärung entnehmen.
Falls ich im Internet auf Portalen der Vogel Communications Group einschließlich deren mit ihr im Sinne der §§ 15 ff. AktG verbundenen Unternehmen geschützte Inhalte abrufe, muss ich mich mit weiteren Daten für den Zugang zu diesen Inhalten registrieren. Im Gegenzug für diesen gebührenlosen Zugang zu redaktionellen Inhalten dürfen meine Daten im Sinne dieser Einwilligung für die hier genannten Zwecke verwendet werden. Dies gilt nicht für den Datenabgleich zu Marketingzwecken.
Recht auf Widerruf
Mir ist bewusst, dass ich diese Einwilligung jederzeit für die Zukunft widerrufen kann. Durch meinen Widerruf wird die Rechtmäßigkeit der aufgrund meiner Einwilligung bis zum Widerruf erfolgten Verarbeitung nicht berührt. Um meinen Widerruf zu erklären, kann ich als eine Möglichkeit das unter https://contact.vogel.de abrufbare Kontaktformular nutzen. Sofern ich einzelne von mir abonnierte Newsletter nicht mehr erhalten möchte, kann ich darüber hinaus auch den am Ende eines Newsletters eingebundenen Abmeldelink anklicken. Weitere Informationen zu meinem Widerrufsrecht und dessen Ausübung sowie zu den Folgen meines Widerrufs finde ich in der Datenschutzerklärung.
Slots sind mächtige Bausteine im Vue.js-Framework, die Komponenten eine enorme Flexibilität verleihen können. Wie eingangs erwähnt lassen sich aber auch viele Probleme durch einfache Props lösen. Props sind immer dann besser geeignet, wenn der Content gleich bleibt und sich durch wenige übergebene Werte anpassen lässt. Weitere Informationen zu Slots finden sich im Component-Guide der Vue.js-Doku.