Webkomponenten: So erstellen Sie benutzerdefinierte HTML-Elemente mit Javascript | Christopher Dodd | Skillshare
Drawer
Suchen

Playback-Geschwindigkeit


  • 0.5x
  • 1x (normal)
  • 1.25x
  • 1.5x
  • 2x

Webkomponenten: So erstellen Sie benutzerdefinierte HTML-Elemente mit Javascript

teacher avatar Christopher Dodd, Web Developer / Educator

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Schau dir diesen Kurs und Tausende anderer Kurse an

Erhalte unbegrenzten Zugang zu allen Kursen
Lerne von Branchenführern, Ikonen und erfahrenen Experten
Wähle aus einer Vielzahl von Themen, wie Illustration, Design, Fotografie, Animation und mehr

Einheiten dieses Kurses

    • 1.

      Einführung

      0:53

    • 2.

      Webkomponenten - Ein Beispiel für Echtes Leben

      1:36

    • 3.

      Die 4 Web

      4:07

    • 4.

      Benutzerdefinierte Elemente Teil 1

      17:17

    • 5.

      Benutzerdefinierte Elemente pt 2

      14:16

    • 6.

      Der Shadow

      15:20

    • 7.

      Slots und Vorlagen

      12:10

    • 8.

      Maßgeschneiderte Einbauelemente

      9:22

    • 9.

      ES

      8:00

    • 10.

      Webkomponenten in der Praxis Teil 1

      29:20

    • 11.

      Webkomponenten in der Praxis Teil 2

      14:59

    • 12.

      Webkomponenten in der Praxis Teil 3

      22:36

    • 13.

      Schlussbemerkung

      0:30

  • --
  • Anfänger-Niveau
  • Fortgeschrittenes Niveau
  • Fortgeschrittenes Niveau
  • Jedes Niveau

Von der Community generiert

Das Niveau wird anhand der mehrheitlichen Meinung der Teilnehmer:innen bestimmt, die diesen Kurs bewertet haben. Bis das Feedback von mindestens 5 Teilnehmer:innen eingegangen ist, wird die Empfehlung der Kursleiter:innen angezeigt.

395

Teilnehmer:innen

--

Projekt

Über diesen Kurs

In der heutigen Klasse erfahren wir mehr über die 4 Spezifikationen, die die meta-specification von Webkomponenten ausmachen, und wie wir diese verwenden können, um neue benutzerdefinierte und wiederverwendbare HTML-Tags für den Einsatz in Webseiten und Webapps zu erstellen.

Für diejenigen unter euch, die mit Javascript programmiert sind, kann es ein nützliches Werkzeug sein, um benutzerdefinierte Elemente für deine Web-Apps und Websites herzustellen, die Funktionalität zu verkapseln und sie überall in einem bestimmten Projekt oder in mehreren Projekten wiederzuverwenden.

Triff deine:n Kursleiter:in

Teacher Profile Image

Christopher Dodd

Web Developer / Educator

Top Teacher

Christopher Dodd is a self-taught web developer, YouTuber and blogger with a mission to help individuals learn the skills to freelance and make a living independently.

Chris learned web development in 2015 in order to work remotely and travel the world and has done so for the past 8 years.

Through his YouTube channel, blog and Instagram, Chris inspires and educates newbie 'digital nomads' to chase their passions and pursue a location independent career.

Vollständiges Profil ansehen

Level: Advanced

Kursbewertung

Erwartungen erfüllt?
    Voll und ganz!
  • 0%
  • Ja
  • 0%
  • Teils teils
  • 0%
  • Eher nicht
  • 0%

Warum lohnt sich eine Mitgliedschaft bei Skillshare?

Nimm an prämierten Skillshare Original-Kursen teil

Jeder Kurs setzt sich aus kurzen Einheiten und praktischen Übungsprojekten zusammen

Mit deiner Mitgliedschaft unterstützt du die Kursleiter:innen auf Skillshare

Lerne von überall aus

Ob auf dem Weg zur Arbeit, zur Uni oder im Flieger - streame oder lade Kurse herunter mit der Skillshare-App und lerne, wo auch immer du möchtest.

Transkripte

1. Einführung: Hallo und willkommen zu diesem Kurs über Webkomponenten, Ihrem Leitfaden zum Erstellen benutzerdefinierter HTML-Elemente mit JavaScript. Ich bin Christopher Dodd. Ich bin freiberuflicher Webentwickler und Top-Lehrer hier auf SkillShare.com, alles über Webentwicklung und Online-Freelancing abdeckt . In der heutigen Klasse werden wir mehr über die vier Spezifikationen erfahren, aus denen die Webkomponenten, die Meta-Spezifikation bestehen, und wie wir diese verwenden können, um neue benutzerdefinierte und wiederverwendbare HTML-Tags für zu erstellen verwenden Sie in Webseiten und Web-Apps. Für diejenigen unter Ihnen , die Erfahrung mit JavaScript zu programmieren, kann das Erlernen, wie Sie benutzerdefinierte Elemente für Ihre Web-Apps und Websites erstellen Elemente für Ihre Web-Apps und , ein nützliches Werkzeug zum Kapseln von Funktionen sein , ein nützliches Werkzeug zum Kapseln von Funktionen und wir verwenden es überall in einem bestimmten Projekt oder über mehrere Projekte hinweg. Wenn Sie bereit sind zu lernen, wie Sie Ihre eigenen benutzerdefinierten HTML-Elemente mit JavaScript erstellen , klicken Sie auf das nächste Video und wir sehen uns auf der Innenseite. 2. Web-Komponenten – Ein Beispiel für das echte Leben: Web Components war etwas , das auf meinem Radar auftauchte angesichts meiner Arbeit mit Shopify-betriebenen E-Commerce-Websites. Es war Juni 2021, als Shopify enthüllte, dass ihr Standardthema aktualisiert wurde um den Großteil der JavaScript-Logik in rund 20 verschiedene Webkomponenten wie Modals, Menge, Eingaben, einzukapseln in rund 20 verschiedene Webkomponenten wie Modals, , und vieles mehr. Sie haben sogar eine eigene Schiebereglerkomponente erstellt keine externen JavaScript-Bibliotheken benötigt. Obwohl ich keine Aussagen von Shopify finden konnte , warum sie sich entschieden haben, ihre neuen Online-Shops 2.0-Themes wie diese zu erstellen , vertraue ich darauf, dass, wenn Webkomponenten wie Shopify, ein Multi-Milliarden-Dollar-Tech-Unternehmen wollte die Logik seiner selbst entwickelten Themen strukturieren, dann war dies eine Spezifikation, die man beachten und mehr darüber erfahren sollte. einer E-Commerce-Website die normalerweise auf Shopify gehostet wird, kann erwartet werden , dass sie über Webkomponenten gekapselt werden kann . Um das Dawn-Thema von Shopify als Beispiel zu verwenden, wichtige Interaktivitätspunkte wie die Artikeltabelle auf der Warenkorbseite, die Optionen zum Filtern von Produkten innerhalb einer Sammlung und das Produktformular, sind alle Bereiche, in denen Funktionen in separaten Webkomponenten gebündelt werden können . Am Ende dieses Kurses werden wir Shopifys Beispiel als Inspiration nehmen, um unsere eigene Warenkorb-Funktionalität zu erstellen unsere eigene Warenkorb-Funktionalität aus drei separaten Komponenten besteht, mit denen alle interagieren einander. Aber bevor wir dort ankommen, müssen wir ein tieferes Verständnis der Theorie hinter Webkomponenten erlangen ein tieferes Verständnis der . Beginnend mit einer Übersicht über die vier Webkomponentenspezifikationen. 3. Die 4 Web: Für diese spezielle Lektion werde ich auf die Website verweisen , die Entwicklern hilft, Webkomponenten zu teilen, zu entdecken und wiederzuverwenden, web components.org. Wenn Sie also zu irgendeinem Zeitpunkt in Bezug auf die folgende Theorie verloren sind, können Sie einfach unter web components.org/specs nachschauen , um weiterzuverfolgen. Wie hier auf web components.org geschrieben, handelt es Webkomponenten um eine Meta-Spezifikation , die durch vier weitere Spezifikationen ermöglicht wird . Die Spezifikation der benutzerdefinierten Elemente, die Shadow DOM-Spezifikation, die HTML-Vorlagenspezifikation und die ES-Modulspezifikation. In dieser Lektion werden wir alle diese Spezifikationen aus theoretischer Sicht kurz behandeln diese Spezifikationen aus theoretischer Sicht und in den nächsten Videos werden wir uns jede Spezifikation in der Praxis ansehen. Fangen wir mit benutzerdefinierten Elementen an. Die Spezifikation der benutzerdefinierten Elemente ist die grundlegende Spezifikation, die Webkomponenten ermöglicht. Mit dieser define-Methode für das benutzerdefinierte Element-Objekt können wir ein neues benutzerdefiniertes Element definieren. Das erste Argument ist der Name des benutzerdefinierten Elements, das wir verwenden, um es innerhalb des HTML aufzurufen. Der zweite Parameter ist der Konstruktor, in den die gesamte Logik hingehen wird. Wir können diese konstruierte Klasse erstellen indem wir die HTML-Elementklasse oder eine vorhandene native HTML-Elementklasse wie im Beispiel hier erweitern oder eine vorhandene native HTML-Elementklasse , aber wir werden etwas später darauf zugreifen. Die meiste Zeit erweitern Sie die reguläre HTML-Elementklasse, um Ihre Komponenten zu erstellen. Dies wird als anonymisiertes benutzerdefiniertes Element bezeichnet. Hier haben wir Zugriff auf die Komponente, wie sie im DOM existiert, über das mächtige Schlüsselwort, dieses Schlüsselwort. Jedes Mal, wenn wir das benutzerdefinierte Element in unserem HTML verwenden, wird eine Instanz erstellt und wir können dann Code innerhalb dieser Klassendeklaration schreiben , der sich speziell auf die jeweilige Instanz der Komponente bezieht . Die nächste Spezifikation ist das Shadow-DOM, dem Sie ein separates DOM für das reguläre DOM erstellen können. Das reguläre DOM wird daher manchmal als das helle DOM bezeichnet, um es zu unterscheiden, wenn es über die Alternative spricht, die das Schatten-DOM ist. Die Shadow-DOM-API ermöglicht es Ihnen, einen DOM-Teilbaum an Elemente in Ihrem Webdokument anzuhängen . Das angehängte Schatten-DOM ist gekapselt, was bedeutet, dass die darin enthaltenen Stilinformationen nicht auf äußere Elemente gelten können und umgekehrt. Wir können das Schatten-DOM über die angehängte Shadow-Methode an jedes Element anhängen. Im Kontext des Aufbaus von Webkomponenten wird das Shadow-DOM in der Regel direkt in der Webkomponente selbst mit this.AttachShadow erstellt . Mit diesem Schattenwurzelobjekt können wir einen Teilbaum von Elementen erstellen, alle für das Hauptlicht-DOM praktisch unsichtbar sind . Lassen Sie uns als Nächstes über die Spezifikation der HTML-Vorlage sprechen. Dies ist einfach eine Möglichkeit für uns, eine HTML-Struktur zu erstellen , die nicht wie normales HTML gerendert wird . Wir erstellen eine Vorlage über das Template-Tag, platzieren unseren HTML-Code darin und wenn die Seite geladen wird, wird der HTML-Code nicht gerendert, aber es ist immer noch über JavaScript zugänglich. Wie der Name schon sagt, können wir diese Tags verwenden, um Vorlagencode zu erstellen , der geklont und an mehreren Orten verwendet werden kann . Im Zusammenhang mit dem Erstellen einer Webkomponente kann das Template-Tag verwendet werden, um den HTML-Code der Komponente zu definieren , indem der HTML-Code innerhalb der Tags geklont und entweder direkt im inneren HTML von die Komponente oder in ihr Schatten-DOM. Schließlich definiert die ES-Modulspezifikation die Aufnahme und Verwendung von JS-Dokumenten in andere JS-Dokumente. Obwohl es für den Aufbau von Webkomponenten nicht unerlässlich ist, Speichern Ihrer Webkomponenten als das Speichern Ihrer Webkomponenten als modularem Code, der in einer eigenen JS-Datei vorhanden ist kann das Speichern Ihrer Webkomponenten als modularem Code, der in einer eigenen JS-Datei vorhanden ist, für die Projektstrukturierung nützlich sein, insbesondere wenn Sie Dritte einbringen Web-Komponenten. Die Syntax für die Spezifikation besteht darin, Ihr externes Skript wie gewohnt zu importieren, außer dass Sie dieses Mal das Modul als Typparameter festlegen. Dann schreiben Sie Eingabe gefolgt vom Pfad zur Datei. Die Funktionen der Spezifikation für benutzerdefinierte Elemente, die Shadow-DOM-Spezifikation, die HTML-Vorlagenspezifikation und die ES-Modulspezifikation funktionieren gut zusammen, um uns beim sauberen Schreiben zu helfen, gekapselte und wiederverwendbare benutzerdefinierte HTML-Elemente. Theoretisch ist es nur die Spezifikation für benutzerdefinierte Elemente , die zum Erstellen benutzerdefinierter Elemente erforderlich ist, aber wie Sie in späteren Videos sehen werden, ist das Kombinieren von Funktionen aus jeder Spezifikation oft der beste Weg, um das Beste aus Webkomponenten herauszuholen. 4. Benutzerdefinierte Elemente Teil 1: wir nun die vier Webkomponentenspezifikationen im letzten Video behandelt haben , schauen wir uns diese ausführlich und in Aktion in unserem Code-Editor an. Was ich mache, ist ein brandneues Projekt zu starten. Ich habe hier einen Ordner für meinen Code. Ich erstelle einen neuen Projektordner und nenne ihn Webkomponenten. Du kannst es nennen, wie immer du willst. Dann ziehe ich das in meinen Code-Editor, nämlich Visual Studio Code, und dieser öffnet diesen Ordner automatisch für uns. Ich schließe das dann, klicke hier auf neue Datei und erstelle eine HTML-Datei. Wir nennen es index.html. jetzt Emmet in Visual Studio Code verwende, kann ich etwas Boilerplate-HTML ausgeben indem ich Ausrufezeichen eintippe und dann auf „Enter“ klicke. Ich ändere den Titel hier nur in Webkomponenten. Dann erstelle ich die JavaScript-Datei, ich nenne sie component.js weil wir zuerst mit einer einzigen Komponente arbeiten werden . Ich mache die klassische Hallo Welt für unsere Konsole. Gehen Sie zurück zu hier und dann letzte Änderung, die ich vornehmen muss, um zu beginnen, besteht darin, diese JavaScript-Datei tatsächlich zu verknüpfen. Da sind wir los. Jetzt gehe ich zurück zu unserem Ordner und lass uns das in Google Chrome öffnen. Es ist Google Chrome für mich, aber Sie können jeden beliebigen Browser verwenden. Ich werde die Befehlsoption I verwenden, um meine Entwicklertools hier zu öffnen, und wenn ich zur Konsole gehe, werde ich das einfach für euch größer machen, ihr könnt Hallo Welt sehen, was uns das zeigt wir verknüpfen die JavaScript-Datei , die wir hier erstellt haben, korrekt. Großartig. Nachdem das erledigt ist, erstellen wir tatsächlich unsere erste Webkomponente. Auch hier gibt es ein paar Boilerplate. Alles, was wir tun müssen, und das wird für jede Webkomponente gleich sein, abgesehen von den integrierten benutzerdefinierten Komponenten, die wir uns später ansehen werden, werde ich diese Webkomponente einfach aufrufen und wie Sie hier sehen können, der erste Buchstabe jedes der Wörter in diesem Klassennamen hier großgeschrieben. Das ist die Konvention, die wir verwenden. Dann tippen wir erweiterte und dann HTML-Elemente ein. Dann brauchen wir hier drin einen Konstruktor. Dann rufen wir die Superfunktion auf, die wir jedes Mal aufrufen werden, wenn wir eine Webkomponente erstellen , und im Grunde genommen erbt dies die konstruktiven Funktionen der Klasse, die sie ist sich ausdehnen. Wir brauchen das, um das zu nutzen , was wir hier erweitern. Dann gehen wir hier runter und beenden dies indem wir die define-Methode für benutzerdefinierte Elemente ausführen. Der erste Parameter wird sein, wie der Elementname in unserem HTML-Dokument aussehen wird , und dann ist das zweite Argument der Klassenname, den wir gerade hier erstellt haben. Dort haben wir es, unsere erste Webkomponente. Um das jetzt auf unser Frontend zu bringen und es in unserem HTML auszuführen, haben wir gerade dieses benutzerdefinierte Tag, Webkomponente, zur Verfügung. Das entspricht natürlich dem, was wir hier in dieser Define-Methode gesagt haben. Vielleicht laufe ich diese Seite an Seite. Los geht's. Um zu überprüfen, ob diese Webkomponente erstellt und auf der Seite ausgeführt wird , stelle ich hier ein Konsolenprotokoll ein und tippe einfach wieder Hello World ein. Gehen wir zurück zu unserem HTML-Dokument, aktualisieren die Seite und Sie können sehen die Hello World Konsolenprotokollierung ist. Wenn wir auf unserer Seite hier nachschauen, können Sie sehen, dass wir dieses benutzerdefinierte Element aufgerufen haben. Bisher scheint dies keine praktische Verwendung zu sein aber während wir diesen Kurs durchlaufen, werden Sie sehen, wie Webkomponenten bestimmte Funktionen für bestimmte Elemente hier einkapseln . Eine der Möglichkeiten, wie wir das sehen können, ist die Verwendung des Schlüsselworts, dieses. Wenn ich dies einfach in ein HTML- und Konsolenprotokoll eintippe, können wir auf alles verweisen, was wir zwischen diesen Tags setzen. Ich werde die Hallo Welt dorthin bringen. Lass uns wieder hier rüber gehen, aktualisieren. Sie können sehen, dass wir einige Inhalte zwischen diesen Webkomponenten-Tags haben, und das wird dann auch hier in unserer Konsole wiedergegeben. Das zeigt Ihnen nur, dass wir die Webkomponente selbst als Referenz verwenden und dann Dinge innerhalb dieser Komponente tun können selbst als Referenz verwenden , die wir in Kürze sehen werden. Das ist unsere grundlegende Webkomponente. Lassen Sie mich Ihnen als Nächstes zeigen, wie wir inneres HTML in unserer Webkomponente erstellen können . Ich mache dies innerhalb der Konstruktormethode, da dies der Konstruktormethode, da immer dann ausgeführt wird, wenn die Komponente konstruiert wird. Ich schreibe hier ein paar Kommentare. Die erste Methode besteht darin , einfach den inneren HTML einzustellen . Das schreibe ich auf. Wir können diesen inneren HTML genau wie zuvor ausführen und anstatt es auszugeben, können wir es überschreiben. Ich verwende hier die Back-Ticks, damit ich kein Problem mit Anführungszeichen habe , sei es doppelte Anführungszeichen oder einfache Anführungszeichen. Was ich tun werde, ist ein div zu erstellen und innerhalb des Divs eine Spanne zu erstellen, und dann werde ich sagen, dass dies eine Webkomponente ist. Wenn ich hier aktualisiere und dann dieses Element inspiziere, kannst du sehen, dass wir diesen HTML-Code in die Webkomponente eingefügt haben . Die zweite Möglichkeit, dies zu tun, besteht darin Elemente zu erstellen und sie zum DOM hinzuzufügen. Ich zeige dir, wie wir das jetzt machen. Lassen Sie uns das kommentieren und ich zeige Ihnen die zweite Option hier. Lasst uns das einfach übergehen, damit wir mehr davon sehen können. Vergrößern Sie möglicherweise die Bildschirmgröße. Da sind wir los. Was ich dann tun werde, ist document create element zu verwenden und wir können den Elementnamen hier buchstäblich eingeben , um ein Element zu erstellen. Aber wir müssen es irgendwo aufbewahren, also stelle ich ein const div vor. Dadurch wird das neu erstellte div-Element in dieser div-Konstante gespeichert . Dann erstelle ich die Spanne, die wir zuvor hatten. Ich erstelle genau das Gleiche wie hier oben. Das Dokument erstellt eine Elementspanne. Dann haben wir jetzt unser div und unsere Spanne. Bevor ich das div an unser Dokument anfüge, aktualisiere ich den inneren HTML der Spanne auf das, was wir zuvor hatten, dies ist eine Webkomponente. Was ich dann tun kann, ist diese Append-Child-Methoden zu verwenden diese Append-Child-Methoden , um das DOM im Grunde zu konstruieren. Ich kann die Spanne innerhalb des div verschachteln, und dann kann ich das Div in der Webkomponente selbst verschachteln, so. Wenn ich jetzt wieder hierher gehe, haben wir ein kleines Problem. Dieses Problem ist, dass wir Inhalte hier einbringen. Ich werde das einfach entfernen, speichere das auf. Wenn wir zurückgehen, gehen Sie los, wir werden div mit der Spanne im Inneren bekommen. Das ist eine andere Art, dies zu tun. Der letzte Weg, dies zu tun, besteht darin, eine HTML-Zeichenfolge zu analysieren. Ich werde das kommentieren und dann schreibe ich den dritten Kommentar, analysiere eine HTML-Zeichenfolge. Sagen wir zum Beispiel, in einer bestimmten Situation hatte ich eine HTML-Zeichenfolge und wollte die HTML-Zeichenfolge als HTML in diese Webkomponente einfügen . Lasst uns das einfach nochmal herstellen. Das Gleiche nochmal, div mit einer Spanne innen, das ist eine Webkomponente, schließe die Spanne, schließe das div. Was ich dann tun muss, weil dies eine Zeichenfolge ist, muss ich sie analysieren. Ich kann es analysieren, indem ich den DOM-Parser verwende. Schauen wir uns das jetzt an. Ich kann const inneres HTML auf einen neuen DOM-Parser setzen und dann die Parse von der String-Methode ausführen, die die HTML-Zeichenfolge als erstes Argument verwendet. Dann das Format text/HTML. Was das dann tun wird, ist, dass es mir dieses analysierte DOM geben wird. Was ich tun muss, ist tatsächlich den Körper zu finden und dann den inneren HTML-Code davon abzuholen. Ich erstelle im Grunde ein neues DOM mit dieser HTML-Zeichenfolge und nehme dann den inneren HTML des Körpers von diesem neuen DOM ab. Was ich dann einfach tun kann, ist zu sagen, dass dieser innere HTML dem inneren HTML entspricht. Da es sich um die Webkomponente handelt, setze ich den HTML-Code der Webkomponente auf den inneren HTML-Code dieser geparsten HTML-Zeichenfolge. Alles scheint gut zu sein. Aktualisieren Sie hier drüben und wir erhalten genau das gleiche Ergebnis. Jetzt wird Ihnen nicht sofort klar sein, warum Sie drei verschiedene Methoden verwenden müssen oder welche Methode Sie verwenden möchten. Verwenden Sie die Methode, die für Sie funktioniert, wenn dies die einfachste ist und Sie damit davonkommen können, verwenden Sie diese auf jeden Fall. Aber es gibt bestimmte Situationen, in denen Sie möglicherweise HTML von einer API zurückgeben, was in Shopify-Themes der Fall ist, dann müssen Sie diese DOM-Parser-Methode verwenden, oder vielleicht erhält es eine etwas kompliziert beim Erstellen neuer Elemente, die in eine komplexere HTML-Struktur passen eine komplexere HTML-Struktur In diesem Fall sollten Sie diese Methode verwenden. In diesem einfachen Beispiel scheint dies der einfachste Weg zu sein, was es ist. Da die Beispiele jedoch komplexer werden, müssen Sie möglicherweise eine Kombination aus diesem oder diesem verwenden . Was ich in diesem kleinen Abschnitt machen wollte war dir zu zeigen, wie du das kannst. Das nächste, was ich Ihnen zeigen möchte, sind benutzerdefinierte Attribute. Ich werde das alles los. Keine Sorge, dies befindet sich alles im GitHub-Link, sodass Sie sich diesen Code wann immer Sie möchten ansehen können. Was ich Ihnen jetzt zeigen möchte, ist, dass wir tatsächlich unsere eigenen benutzerdefinierten Attribute erstellen können . Hier in diesem Webkomponenten-Tag könnte ich etwas wie Text oder einen beliebigen Parameter eingeben , den ich durchsetzen wollte. Sagen wir einfach, dies ist eine Webkomponente. Ich habe einen Parameter mit dem Namen Text und ich analysiere das als Wert. Wie benutzen wir das? Nun, ich werde das schließen. Was ich tun werde, ist über this.getAttribute auf dieses Attribut zuzugreifen . Dann ist das Argument dafür der Attributname selbst, der Text ist. Lassen Sie uns das einfach konsolenprotokollieren , um loszulegen. Dann finden wir eine praktischere Verwendung davon. hier aktualisiert werde, wenn ich in die Konsole gehe, können Sie sehen, dass dies eine Webkomponente ist, die dem Parameter entspricht, den ich hier durchgesetzt habe. Das ist bisher nicht sehr hilfreich. Was ich tun werde, ist Nummer 1, ich setze das in eine Variable ein. Ich erstelle eine Variable innerhalb dieser Komponente füge sie also an diese an. Ich nenne es inneren Textinhalt. Aber bevor ich das mache, möchte ich prüfen, ob dieses Element tatsächlich dieses Attribut hat. Ich verwende die hat-Attribut-Methode die hat-Attribut-Methode die Text als Attributnamen durchsucht. Dann lege ich das in den If-Block dort. Auch hier sollte das funktionieren. Hier gibt es keine Fehler, es gibt kein Konsolenprotokoll, aber das liegt daran, dass wir noch nichts protokolliert oder etwas geändert haben. Was ich hier machen könnte, ist genau wie zuvor, verwende die Methode, die wir vor dieser einfachen Methode hatten , einfach den inneren HTML einzustellen. Was ich tun werde, ist dieselbe Struktur erneut mit dem div und der verschachtelten Spanne zu verwenden dieselbe Struktur erneut mit . Aber in der verschachtelten Spanne werde ich einen dynamischen Wert angeben, werde ich einen der auf diesem Attribut basiert . Da wir diese Variable genau hier setzen, werde ich das hier hier hineinlegen this.InnerTextContent. Dann aktualisiere hier drüben. Sie können sehen, dass wir das gleiche Ergebnis haben wie zuvor. Gehen wir zurück in unser HTML. Wenn ich das ändern sollte, ist dies eine Komponente. Das wird in die Spanne geschickt. Nun ist das einzige Problem dabei, wenn wir wieder hier reingehen und sagen wir, wir haben eine ziemlich dynamische Webkomponente hier eine ziemlich dynamische Webkomponente, in der sich dieser Wert ändern wird. Wenn ich das ändere, ist dies wiederum eine Webkomponente, nur keine Komponente. Sie werden sehen, dass nichts aktualisiert wird. liegt daran, dass wir tatsächlich auf Änderungen an Attributen achten müssen, damit sich dies tatsächlich ändert. Zurück zur Datei component.js werden wir im nächsten Abschnitt mehr über Lebenszyklusmethoden sprechen . Aber im Moment zeige ich Ihnen die Lebenszyklusmethode, mit der wir nach Attributänderungen suchen können. Hier hat unser rechtes Attribut den Callback geändert, und es braucht drei Argumente. Der erste ist der Attributname selbst. Ich sage den attr-Namen. Das zweite Attribut ist der alte Wert, und das dritte Attribut ist der neue Wert, der Wert, in den es geändert wird. Dann stelle ich es hier in einen Scheck. Wenn der atrr-Name Text ist , aktualisieren wir den inneren HTML-Code. Behalte diese Struktur bei. Anstelle dieses inneren Textinhalts setzen wir diesen auf den neuen Wert, der im Callback durchkommt. Das mag der letzte Schritt sein, aber es gibt noch einen weiteren Schritt, den wir tun müssen, nämlich die Webkomponente anzuweisen , auf dieses bestimmte Attribut zu achten. Dies ist nur eine Möglichkeit für Webkomponenten, schlanker zu sein und sicherzustellen , dass sie keine Attribute überprüfen , die für den Programmierer keine Rolle spielen . Was wir dafür tun müssen, ist einfach statisch einzugeben, beobachtete Attribute zu erhalten. Dann geben wir einfach ein Array mit allen Attributen zurück , die wir sehen möchten, nämlich nur Text. Gehen wir hier zu unserem Browser, aktualisieren. Wir haben einen Syntaxfehler. Das liegt daran, dass ich das außerhalb des Konstruktors stellen muss. Dies ist die Konstruktormethode genau hier. Ich muss das rausstellen und hier auffrischen. Das sollte funktionieren. Keine Fehler. Wenn ich hier hineingehe und mich ändere, ist dies eine Komponente, die eine Webkomponente oder irgendetwas anderes ist , können Sie sehen, dass sich das innere HTML geändert hat. Wir haben diese Methode hier erfolgreich ausgeführt, da wir nach beobachteten Attributen mit dem Namen Text suchen. Wir prüfen, ob der Attributname, durch diesen Callback kommt, Text ist, und wenn ja, aktualisieren wir das innere HTML auf diese neue HTML-Struktur mit dem neuen Wert. Wir haben bereits einiges mit der Spezifikation für benutzerdefinierte Elemente behandelt . Ich werde die zweite Hälfte dieses Videos in einen Teil 2 aufteilen . Im nächsten Teil werden wir uns Lebenszyklusmethoden und benutzerdefinierte Ereignisse ansehen . 5. Benutzerdefinierte Elemente Teil 2: In diesem Video in Teil 2, dem die Funktionen der Spezifikation für benutzerdefinierte Elemente diskutiert werden, werden wir über Lebenszyklusmethoden und benutzerdefinierte Elemente sprechen . Im letzten Video haben wir tatsächlich eine dieser Lebenszyklusmethoden gesehen , den Rückruf der Attributänderung. Ich werde das als Nummer 3 eintragen, worüber wir in nur einer Sekunde sprechen werden. Ein bisschen Haftungsausschluss hier, ich werde Konstruktor Nummer 1 hier betrachten , obwohl es technisch gesehen keine Lebenszyklusmethode ist, aber es hilft, den Konstruktor im Kontext des Lebens zu betrachten . Zyklusmethoden sowieso Hier gibt es eine zweite, die ich in Kürze verraten werde, und einen vierten , den ich hier verraten werde. Sprechen wir zuerst über den Konstruktor. Der Konstruktor, ich schreibe hier welche und ich lege das in GitHub für euch, damit ihr später darauf verweisen könnt. Lasst mich diesen Tippfehler beheben. Dies wird ausgeführt, wenn die Komponente im Speicher erstellt, aber noch nicht unbedingt an das DOM angehängt wird . Laut meinen Recherchen ist dies der beste Ort für die Initialisierung, aber nicht der beste Ort für die Interaktion mit dem DOM. Jetzt ist der Unterschied zwischen dem Konstruktor und dem nächsten ziemlich subtil. Aber wenn Sie jemals Probleme damit haben, etwas in diese Konstruktorfunktion zu stecken und es nicht funktioniert, ist der nächste wahrscheinlich der Ort, an dem Sie es platzieren müssen, und dieser ist der verbundene Callback. Ich tippe das hier ein, verbundener Callback. Das wird ausgeführt, wenn das Element tatsächlich an das DOM angehängt ist. Es sieht genau so aus, verbundener Callback. Dieser dritte, wie wir zuvor gesehen haben, Attribut Changed-Callback einfach, ob sich überprüft das Attribut Changed-Callback einfach, ob sich ein Attribut geändert hat. Ziemlich einfach zu verstehen. Dieser vierte, den wir uns ansehen werden ist der getrennte Callback, der das vollständige Gegenteil des verbundenen Callbacks ist. Dies läuft, wenn das Element vom DOM getrennt ist. Du denkst vielleicht, warum brauchen wir das? Es ist nützlich, um Bereinigungen durchzuführen, also Prozesse, die wir nicht mehr ausführen möchten, sobald wir sie losgeworden sind. Es sieht genauso aus wie der verbundene Callback außer dass es sich um einen getrennten Callback handelt. Es gibt ein oder zwei weitere, aber das sind die wichtigsten. Wir haben einen Konstruktor gesehen, wir haben Rückruf von Attributänderungen gesehen. Die beiden, die wir noch nicht angeschaut haben, bis dieses Video verbunden und getrennt wurde. Was ich hier machen werde, ist ein paar Konsolenprotokolle zu erstellen und dann kann ich Ihnen zeigen, wie es aussieht , wenn ein verbundener Callback ausgeführt wird und der getrennte Callback ausgeführt wird. Alles, was ich tun werde, ist verbundener Callback zu sagen und dann rechts hier rein zu schreiben, getrennter Callback. Wenn ich diesen Code jetzt ausführe, wenn ich in meine Konsole gehe, aktualisiere die Seite, du kannst sehen, dass der verbundene Callback ausgeführt wird. Wenn ich hier ein Konsolenprotokoll einfüge und sagen wir einen Konstruktor, und dann laufen wir hier rüber, können Sie sehen, dass der Konstruktor und der verbundene Callback ausgeführt wird. Hier passiert der subtile Unterschied zwischen Konstruktor und verbundenem Callback. verbundene Callback ist technisch gesehen, wenn das Element an das DOM angehängt wird und der Konstruktor im Speicher erstellt wird. Aber die beiden passieren automatisch sobald wir diese Komponente in unser Dokument eingefügt haben. Wie kann ich Ihnen den Unterschied zwischen verbundenem Callback und Konstruktor demonstrieren ? Nun, eine der Möglichkeiten, wie ich Ihnen dies zeigen kann, besteht darin, diese Webkomponente programmgesteuert aus dem DOM zu entfernen , immer noch in einem Speicher zu haben und sie dann wieder zu verbinden. Das mache ich in diesem Beispiel genau hier. Direkt über dem Komponenten-JS-Skripttag erstelle ich ein weiteres Skript-Tag. Was ich tun werde, ist die Webkomponente selbst in den Griff zu bekommen. Ich erstelle eine variable Webkomponente, und dann verwenden wir den Dokumentabfrage-Selektor um das Webkomponentenelement zu erfassen. Genau wie bei jedem anderen Element können wir dies auch mit unseren eigenen benutzerdefinierten Elementen tun. Was ich dann tun werde, ist, dies nur auf Timeout für die Zwecke dieses Beispiels zu stützen . Ich erstelle diese Timeout-Funktion. Lass es uns nach einer Sekunde laufen. Dann werde ich innerhalb der Timeout-Funktion das Kind im Dokumententext entfernen und das HTML der Webkomponente aus dem Dokumententext entfernen, nur um es erneut anzuhängen. documentBody.append untergeordnete Webkomponente. Im Grunde genommen wird dies nur getan, nachdem eine Sekunde dieser Seite geladen wurde, werden wir diese Webkomponente aus dem Körper entfernen , auf dem sie sich gerade befindet, und sie wieder in den Körper legen. Lasst uns hier auffrischen und eine Sekunde warten. Sie können sehen, dass die Konstruktorfunktion einmal ausgeführt , da die Webkomponente einmal im Speicher erstellt wird. Dann geschieht der verbundene Callback natürlich ziemlich gleichzeitig mit dem Konstruktor. Aber was wir dann nach einer Sekunde sehen, wenn ich das nach einer Sekunde erneut ausführe, was der Parameter ist, den wir hier für das Timeout setzen, werden Sie sehen, dass der getrennte Callback ausgeführt wird, weil wir entfernen eine Webkomponente aus dem DOM und dann setzen wir sie zurück damit der verbundene Callback wieder ausgeführt wird. Hier sehen Sie den subtilen Unterschied zwischen dem Erstellen des Speichers des Konstruktors und der Interaktion der Webkomponente mit dem DOM. Oft passiert es gleichzeitig. Wenn wir jedoch die Webkomponente nehmen und in unserem DOM verschieben würden , verbundener Callback und getrennter Callback nützlich. Wir haben dort zwei in einem demonstriert. Aber wenn wir hierher zurückkehren und ich hier tatsächlich in den Elementbereich meiner Entwicklungstools gehe , klicke auf die Webkomponente. Lassen Sie uns das alles klären. Klicken Sie jetzt auf dieses Element und löschen Sie es aus unserem DOM. Wenn ich zur Konsolenregisterkarte gehe, können Sie sehen, dass der getrennte Callback erneut ausgeführt wurde. Das ist im Grunde verbundener Callback und ein getrennter Callback. Es wird einfach ausgeführt, wenn das Element an das DOM angehängt ist und wenn das Element vom DOM getrennt ist. Wir werden sehen, wie wir den verbundenen Callback in einem Beispiel verwenden müssen , sobald wir später in dieser Klasse in der Praxis zu Webkomponenten gelangen , aber vorerst, bis Sie ein Problem haben, bei dem Sie müssen den verbundenen Callback verwenden, Sie können wahrscheinlich nur den Konstruktor für alle Ihre Initialisierungen und alles verwenden , was Sie ausführen möchten , wenn diese Webkomponente erstellt wird. Sobald Sie jedoch Probleme beim Ausführen von Code in Ihrem Konstruktor haben , müssen Sie sich die verbundene Callback-Funktion ansehen . Das sind Lebenszyklusmethoden. in dieser Spezifikation für benutzerdefinierte Elemente möchte ich in dieser Spezifikation für benutzerdefinierte Elemente über benutzerdefinierte Ereignisse sprechen. Was ich tun werde, ist etwas von diesem Code zu löschen. Ich werde dieses Set Timeout loswerden . Ich werde meine Webkomponente hier immer noch in dieser Konstante behalten . Schlag „Sparen“ drüber, geh hier rüber. Was ich tun werde, ist diesen HTML hier zu aktualisieren. Ich muss es zweimal machen weil wir das auch hier haben. Ich erstelle einfach einen Button. In diesem Button setze ich nur spezielle Ereignis des Inhalts Trigger ein. Ich kopiere den Code hier rüber. Wenn sich das Attribut ändert , geschieht dies beim ersten Mal, wenn das Attribut ohnehin gesetzt wird. Wenn wir dies nicht tun, wenn ich das nicht lasse und die Seite ausführe, sehen Sie, dass die Schaltfläche ohnehin nicht angezeigt wird, da sich die Attributänderung ändert, Callback ausgeführt wird, sobald er dieses Attribut erkennt. Dies ist nicht der sauberste Code, aber wir werden hier kopieren und einfügen. Wenn ich mir jetzt meine Komponente hier ansehe und auf diesen Button klicke, werden wir es in Kürze dazu bringen, etwas zu tun. Lassen Sie uns diese Konsolenprotokolle loswerden. Wir brauchen sie nicht mehr. Wir können diesen verbundenen Rückruf dort behalten. Ich werde diese Kommentare hier loswerden, die ich im entsprechenden Zweig des GitHub hinterlasse , damit du später darauf verweisen kannst. Ich werde diese Kommentare vorerst einfach los. Dann werde ich unser eigenes individuelles Event erstellen. Ich erstelle eine Methode, die auf unserem EventListener ausgeführt wird, also lösen Sie auf unserem EventListener ausgeführt wird, ein spezielles Ereignis aus. Um ein eigenes individuelles Ereignis zu erstellen , können wir einfach ein neues Ereignis zuweisen. Im Parameter hier können wir das Ereignis anrufen, wo immer wir wollen. Ich nenne es einfach Special. Jetzt, dieses neue Ereignis , wird dieses besondere Ereignis in dieser speziellen Ereigniskonstante gespeichert . Wenn diese Methode ausgeführt wird, können wir Ereignis durch Ausführen eines dispatch-Ereignisses auslösen. Dann läuft hier drin ein besonderes Event. Was wir dann hier oben tun werden, geht zu unserem verbundenen Callback und fügt auf der Schaltfläche einen Ereignis-Listener hinzu, um dieses spezielle Ereignis auszuführen. Ich werde die Schaltfläche in dieser Webkomponente finden, die wir über diesen Abfrageselektor tun können. Fügen Sie EventListener hinzu und suchen Sie nach dem Klickereignis. Dann können wir dieses Trigger-Spezialereignis ausführen. Dann werden wir dies binden und uns erlauben , dies als Webkomponente zu referenzieren. Wenn die Bind-Methode Sie ein wenig verwirrt , machen Sie sich keine Sorgen. Es hat mich auch eine Weile verwirrt. Alles, was es tut, ist sicherzustellen, dass dieses Schlüsselwort innerhalb der Funktion mit dieser Webkomponente zusammenhängt , nicht mit der Funktion oder irgendetwas anderem. Es ist nur ein zusätzlicher Schritt. Wenn wir es nicht benutzen, werden wir damit enden dass dies nicht das ist, was wir beabsichtigt haben. Was nun passieren wird, ist, wenn wir auf den Button klicken, werden wir dieses spezielle Ereignis auslösen das unser eigenes benutzerdefiniertes Ereignis auslöst, das als Sonderereignis bezeichnet wird. Aber wenn ich auf den Button klicke, passiert wirklich nichts. Technisch gesehen wird dieses besondere Ereignis ausgelöst, aber wir hören nicht wirklich auf dieses besondere Ereignis. Nichts wird wirklich auf der Seite aktualisiert. Lasst uns das ändern. Gehen wir hier in unsere HTML-Datei ein. Darunter hier in unserem Script-Tag füge ich diesen EventListener zu unserer Webkomponente hinzu. Wir haben unsere Webkomponente hier bereits in dieser Konstante gespeichert , also kann ich eine Webkomponente erstellen, EventListener hinzufügen. Wir können buchstäblich auf das besondere Ereignis hören , das wir geschaffen haben, damit wir etwas Besonderes machen können. Dann setzen wir einfach diese anonyme Funktion ein, die einfach das Konsolenprotokoll einführt. Das Sonderereignis wurde ausgelöst. Wir haben hier drei Schritte. Wir haben eine spezielle Ereignismethode erstellt , die ein benutzerdefiniertes Ereignis auslöst, das wir als special bezeichnet haben. Wir haben das an den Klick EventListener auf der Schaltfläche angehängt. Dann werden wir auf dieses spezielle Ereignis in der Webkomponente selbst und im Konsolenprotokoll warten, das spezielle Ereignis wurde ausgelöst , wenn dieses Ereignis ausgelöst wurde. Wenn wir hier zu unserem Dokument zurückkehren und ich auf „Sonderereignis auslösen“ klicke , können Sie sehen, dass es ausgeführt wird, das spezielle Ereignis wurde ausgelöst. Wenn ich darauf klicke, siehst du die Nummer hier hoch. Offensichtlich kommuniziert dieses einfache Beispiel nicht die Notwendigkeit eines benutzerdefinierten Ereignisses. Wenn Sie jedoch komplexere Elemente haben möchten Sie möglicherweise eine Schaltfläche haben, die das spezielle Ereignis auslöst. Sie möchten etwas anderes haben , das das besondere Ereignis auslöst. Es ist einfach semantisch sinnvoll, ein besonderes Ereignis auf Ihrer Webkomponente zu haben , dann ist dies praktisch. Ein Beispiel, das Sie in der realen Welt finden könnten , ist Modals. Möglicherweise haben Sie ein geschlossenes Ereignis für eine modale Webkomponente. Dieses geschlossene Ereignis wird möglicherweise durch einen Klick auf die Schaltfläche oder durch Klicken außerhalb des Modals oder durch Klicken auf Abbrechen ausgelöst einen Klick auf die Schaltfläche oder durch Klicken . Sie haben drei verschiedene separate Ereignisse, die dasselbe Ereignis in der Webkomponente selbst auslösen möchten . Anschließend können Sie außerhalb Ihrer Webkomponente prüfen, ob das geschlossene Ereignis dieser modalen Webkomponente ausgeführt wurde. Das ist ein Beispiel, das ich in der realen Welt für die Verwendung benutzerdefinierter Elemente gesehen habe . Aber wieder habe ich es in diesem Video sehr einfach gemacht, so einfach wie möglich für euch, es in Aktion zu sehen. Wenn Sie diese Funktion nicht verwenden müssen, müssen Sie sie nicht verwenden. Aber wenn Sie es in der realen Welt sehen und versuchen zu verstehen, was vor sich geht, wenn Sie so etwas sehen, ist dies die Erklärung. Wir können benutzerdefinierte Ereignisse erstellen, die wir in unserer Webkomponente versenden können . Dies ermöglicht es uns, nach Ereignissen zu suchen , die in der Webkomponente selbst stattfinden. Es ist Teil dieser ganzen Denkweise, Funktionen und Ereignisse innerhalb einer Komponente zu kapseln . Das ist alles, worüber ich zum Thema der Spezifikation für benutzerdefinierte Elemente sprechen wollte . Im nächsten Video werden wir über das Shadow DOM sprechen. 6. Der Shadow: Willkommen zurück, Leute. In diesem Video werden wir mit dem letzten Video in Bezug auf unser kleines Projekt hier weitermachen, wo wir aufgehört haben. Aber wir werden zu etwas namens Shadow DOM-Spezifikation übergehen , was, wie wir im Theorieabschnitt erfahren haben, eine Möglichkeit ist, einen DOM-Teilbaum an eine separate Webkomponente anzuhängen aus dem Haupt-DOM. Wir haben also unser Haupt-DOM hier, wie es durch unser HTML dargestellt wird. Wir können ein sogenanntes Shadow-DOM unserer Webkomponente oder für jedes Element erstellen. Und dieses DOM ist getrennt dem, was manchmal als Licht-Dom bezeichnet wird, der Schatten und Licht sind Gegensätze. Das Regular DOM den Light Dom zu nennen, ist also eine Möglichkeit, es vom Schattendom zu unterscheiden. Vielleicht hörst du, dass ich in diesem Video das normale DOM als den Light Dom bezeichne . Also nur eine Notiz da. Was ich also tun werde, ist, einen Teil dieses Codes für die benutzerdefinierten Ereignisse zu entfernen . Es ist sowieso ein bisschen alberner Code , der nur einen Punkt demonstrieren sollte. Also werde ich diesen verbundenen Callback und dieses besondere Ereignis loswerden . Wir brauchen es nicht wirklich, ich lasse den getrennten Callback da drin. Und ich gehe hier rüber und entferne einfach all dieses zusätzliche JavaScript aus dem HTML-Dokument. Lasst uns also direkt hineinspringen und einen Shadow Dom an unsere benutzerdefinierte Webkomponente anhängen . Wie wir das machen, ist sehr einfach. Was wir tun, ist die Methode auszuführen, Schatten anzuhängen. Und das tun wir dem Schlüsselwort, das sich auf die Webkomponente bezieht natürlich mit dem Schlüsselwort, das sich auf die Webkomponente bezieht. Und alles, was wir tun müssen, ist ein JavaScript-Objekt zu übergeben. Und wir werden im Modus „öffnen“ passieren. Wir können auch im Modus „geschlossen“ passieren, aber es ist ziemlich irrelevant. Sie können nachschlagen, warum wir offen oder geschlossen vorbeigehen würden , indem Sie etwas recherchieren, aber das ist momentan nicht besonders wichtig. Was ich also tun werde, ist, anstatt unseren HTML-Code direkt in das Element eingefügt zu haben, was ich tun werde, ist hier Shadow Root. Dies ist ein spezielles Schlüsselwort, das es uns ermöglicht, diesen inneren HTML an den Shadow Root anzuhängen , der der Anfang des DOM-Teilbaums innerhalb unseres im Grunde Shadow-DOM ist . Lassen Sie mich das speichern , was schon ist. Wechseln Sie zu unserem HTML. Ich habe auch hier ein Diagramm. Übrigens öffneten sie sich zwischen den Unterrichtsstunden. Das zeig ich dir in nur einer Sekunde. Und dann lasst uns hier drüben auffrischen. Dann gehen wir auf Elemente ein und klicken wir in dieses Element. Jetzt können Sie sehen, dass wir das Gleiche haben wie zuvor, aber wir haben auch eine Schattenwurzel. Dann können wir hier hineinklicken und einen Blick darauf werfen, und Sie können sehen, dass wir diesen inneren HTML-Code haben. Der Grund, warum wir dieses andere Div auch dort haben , glaube ich, ist, dass wir das nicht in Shadow Root geändert haben. Also werde ich das ändern, hier aktualisieren. Und jetzt können Sie sehen, ob wir in unsere Webkomponente gehen, wir haben dieses div nicht und spanne nicht, aber was wir haben, ist ein Shadow Dom. Und in diesem Shadow Dom haben wir ein div und die Spanne und natürlich den Button , der in diesem Shadow Dom nichts mehr tut . Vielleicht denken Sie darüber nach, was ist der Unterschied zwischen dem Anhängen an den Shadow Dom und dem Anhängen dieses HTML-Codes direkt an die Webkomponente. Und ich bin froh, dass Sie sich das fragen , denn genau darüber werde ich jetzt in dieser folgenden Tabelle sprechen. Im Grunde genommen ist die Hauptsache bei Shadow Dom CSS. Angesichts der Tatsache, dass der Shadow Dom vom Haupt-DOM getrennt ist, erbt es nicht das CSS des Light Dom, wie wir hier in dieser Tabelle sehen können. Wenn ich zum Shadow Dom Inhalt gehe, gilt das Light Dom CSS nicht. Auf der anderen Seite gilt jedes CSS innerhalb des Shadow Dom nicht für die Webkomponente selbst oder Inhalte außerhalb. Wir können dies jedoch überwinden, indem den Pseudoselektor des Doppelpunkts verwenden , über den wir in nur einer Sekunde sprechen werden. Im Grunde fasst diese Tabelle also die Beziehung zwischen Light DOM CSS und Shadow DOM CSS in Bezug auf die Webkomponente selbst zusammen, den Inhalt innerhalb dieser Webkomponente und die Shadow DOM-Inhalt. Ich werde jedes dieser Beispiele in Kürze durchgehen , aber fangen wir einfach mit einem grundlegenden Beispiel an, um uns hier zu starten. Das geht irgendwie in das nächste Video weiter, aber ich werde einen Slot erstellen. Lassen Sie mich hier also einfach in die Komponente gehen. Und anstelle von Button werde ich einen Slot erstellen. Ich kopiere es auch hier unten. Natürlich werden wir alle Inhalte, die ich hier einlege, dorthin gehen, wo unser Slot-Tag eingestellt wurde. Was ich also tun werde, ist eine Spanne zu erstellen und zu sagen, dass dies ein eingesetztes Element ist. Und dann werde ich anfangen , etwas CSS in unserem Light Dom zu schreiben. Also gehe ich auf die Spanne ab und gebe ihr eine rote Farbe. Klicken Sie hier bei dieser Aktualisierung auf „Speichern“. Und Sie können sehen, dass dies ein eingeschlitztes Element ist und die Farbe tatsächlich rot ist. Aber was Sie vielleicht auch bemerkt haben, ist, dass sich innerhalb dieses Divs eine weitere Spanne befindet. Und diese Spanne nahm das CSS in unserem Light Dom nicht an und das liegt daran, dass es Teil der Schattenwurzel ist. Wenn wir also dieses spezielle Tag stylen wollten, würden wir hier in die Komponente gehen und überall dort, wo wir unseren HTML-Code erstellen, erstellen wir ein separates Style-Tag. Und dann können wir unsere Spanne so einfärben. Lass es uns grün machen. Und wieder, nicht der sauberste Code, aber wir müssen ihn auch hier kopieren . Ich klicke auf „Speichern“ und aktualisiere dann hier drüben. Sie können sehen, dass die Schatten-Dom-Spanne grün und die eingezogene Spannweite rot ist. Dies ist also die Grundlagen zum Styling des Shadow Dom. Wenn Sie ein Element im Shadow Dom haben, muss das Styling normalerweise auch innerhalb des Shadow Dom erfolgen. Und das wirkt sich nicht auf eine Spannweite aus, die eingeschlitzt ist. Umgekehrt erben alle Elemente im Shadow Dom nicht die Stile des Light Dom. Wie Sie hier gesehen haben, traf innerhalb des Light Dom setzte auf die Spanne innerhalb des Light Doms zu, als ich eine Stilregel für Farbe Rot auf Spannweiten nicht auf die Spanne innerhalb des Light Doms zu, als ich eine Stilregel für Farbe Rot auf Spannweiten innerhalb des Light Dom setzte. Das ist also das grundlegende Beispiel für das Styling des Shadow Dom. Aber lasst uns tatsächlich zu unserem Diagramm zurückkehren und lasst uns die verschiedenen Szenarien durchgehen. Also das erste Szenario, das das Light Dom CSS verwendet , um die Webkomponente selbst zu stylen. Was ich damit meine, ist genau so, als würden wir den Elementnamen verwenden, um diese Spanne anzusprechen. Das können wir auch mit einer Webkomponente tun. Es funktioniert also wie jedes andere HTML-Element. Wir können einfach Web Component schreiben und sagen wir einfach Textdekoration, unterstreichen, speichern und aktualisieren, und Sie können sehen, dass die gesamte Webkomponente jetzt eine Unterstreichung hat. hier zurück zum Shadow Dom CSS gehen, können wir die Webkomponente selbst aus dem Shadow Dom heraus stylen die Webkomponente selbst aus dem Shadow Dom heraus , indem wir einen speziellen Pseudo-Selektor-Doppelpunkt-Host verwenden. Also lasst uns zurückgehen und das jetzt machen. Wenn ich also hier in unsere Komponente gehe und bevor wir diese Grünspanne machen, lass uns hosten. Vielleicht lassen Sie uns einfach das Schriftgewicht von allem in der Webkomponente fett machen . Ich klicke auf „Speichern“ und aktualisiere hier drüben. Das funktioniert aufgrund dieses Rückrufs zur Attributänderung nicht. Lassen Sie uns das jetzt aufräumen und diesen sauberen Code erstellen. Anstatt genau denselben Code zweimal einzustellen, werde ich die spezifische Spanne hier anvisieren und diesen Wert auf den neuen Wert aktualisieren. Anstatt das innere HTML explizit auf den Schattenstamm zu setzen , gehe ich hierher zurück, finde diese bestimmte Spanne auf der Schattenwurzel, ziele dann auf den inneren HTML dieser Spanne und setze ihn dann auf der neue Wert. Das ist viel sauberer. Auf diese Weise behalten wir die innere HTML-Struktur unserer Schattenwurzel bei, ohne das Ganze jedes Mal aktualisieren zu müssen. Das sollte dies jetzt funktionieren lassen, was es tut, wir haben jetzt die gesamte Webkomponente fett, und wir konnten dies innerhalb des Schatten-Roots mithilfe dieses Host-Pseudo-Selektors tun . Gehen wir hier zurück an den Tisch. Schauen wir uns den geschlitzten Inhalt an. Der geschlitzte Inhalt im Kontext des Light DOM wird nicht als Teil des Shadow-DOM angesehen, daher gelten hier Light DOM-Stile. Das haben wir schon gesehen. Wir haben es im Falle dieser Spanne hier gesehen , die eingeschlitzt wurde. Die Farbe dieser Spannweite ist rot. Da es nicht als Teil des Shadow-DOM angesehen wird, gelten hier die Light-DOM-Stile. Aber wie wir zuvor mit dem Host-Selektor gesehen haben, gibt es eine Möglichkeit, diesen Sloting-Inhalt auch innerhalb des Shadow DOM CSS zu stylen . Wir müssen nur die Schlitz-Pseudoklasse mit Doppelpunkt verwenden und wir müssen einen Parameter übergeben . Lass uns das jetzt machen. Gehen wir in unsere Datei component.js. Lassen Sie uns diese geschlitzte Pseudoklasse und den Parameter eingeben. Wir werden die Spanne einsetzen, damit wir die geschlitzte Spanne stylen . Lassen Sie mich die Farbe ändern, sagen wir mal, grau. Wenn wir dann rübergehen und uns auffrischen, was wird Ihrer Meinung nach passieren? Lasst es uns herausfinden. Wie Sie sehen können, ändern sich diese Farben nicht. Warum ist das so? Wenn wir uns dieses zweite Element hier ansehen, welches das einschlitzte Element ist, und wir uns die angewendeten Stile ansehen , können Sie sehen, dass wir hier unsere Farbe Rot haben, und dann haben wir unsere Farbe Grau für die Spanne, aber die Farbe Rot überschreibt. Dies stimmt mit dem überein, was ich hier in der Tabelle geschrieben habe , was ich hier in der Tabelle geschrieben Im Falle von Konflikten die Stile aus dem Light DOM Vorrang. Man könnte denken, ich habe das zuletzt gesetzt , damit das Grau die Kontrolle übernehmen würde, aber den Fall, dass es einen Stil für diesen bestimmten Inhalt im Light DOM gibt, kommt der Stil im Light DOM zu kontrolliere die Farbe. Wenn wir diese Zeitspanne innerhalb unseres Shadow-DOM stylen wollten , müssen wir sicherstellen , dass dies nicht da ist. Wenn ich das kommentiere und dann hier aktualisiere, kannst du sehen, dass wir das in Grau stylen können, wenn es nicht von einem Stil überschrieben wird, der sich auf dasselbe Element in unserem Light DOM bezieht . Erfrischen Sie uns hier drüben, lassen Sie es uns auf rot halten und gehen wir zurück zu unserer letzten Zeile, abgesehen von der Ausnahme hier für Shadow DOM-Inhalte in unserer Tabelle. Jedes Light DOM CSS hat keine Auswirkungen auf unser Shadow-DOM. Ich denke, wir können bereits einige Beispiele dafür sehen. Wir können sehen, dass es allen Spannelementen eine Farbregel für Rot gibt. Aber wenn wir hier reingehen, haben wir eine Spanne in unserem Shadow DOM und natürlich ist es immer noch grün. Wir haben gesehen, dass bereits und dann mit dem Shadow DOM CSS offensichtlich jedes CSS, das wir im Shadow DOM erstellen, einen direkten Einfluss auf das Shadow DOM haben wird . Auch hier haben wir gesehen, dass Sie beim Styling unseres Span-Elements innerhalb des Shadow-DOM sehen können, dass es grün ist. Das ist im Grunde der ganze Tisch. Die einzige Ausnahme ist, dass Light DOM CSS-Variablen innerhalb des Shadow DOM CSS zugänglich sind . Wenn Sie zuvor CSS-Variablen verwendet haben, wie dies funktioniert, können wir in unserem Light-DOM einige CSS-Variablen erstellen. Was ich tun werde, ist, im Root eine CSS-Variable namens BG-Farbe zu erstellen , und wir setzen diese auf Schwarz. Was ich dann mache, ist, dass ich hier reingehe und lass uns die Hintergrundfarbe auf die Variable der BG-Farbe setzen , auf „Speichern“ klicken und hier aktualisieren. Sie können sehen, dass wir, obwohl die CSS-Variable im Light DOM definiert wurde, die CSS-Variable im Light DOM definiert wurde, sie immer noch in das Schatten-DOM bringen können. Es ist nur so, dass die CSS-Regel im Shadow DOM CSS enthalten sein muss . Dies gibt uns eine gewisse Kontrolle über den Shadow-DOM-Inhalt in Bezug auf Verwendung von Variablen in unserem Light DOM. Wenn wir ein Farbschema hatten, kann ich das ändern, lasst uns das gelb machen und auf „Speichern“ klicken. Jetzt können Sie sehen, dass wir Werte innerhalb des Light DOM aktualisieren können , was sich auf das Shadow-DOM auswirkt , wenn Sie Variablen verwenden. Aber abgesehen davon, wenn wir hier reingehen und Spanne, Hintergrund, Farbe sagen würden, was sollen wir tun? Lass uns blau werden. Wir haben diese Span-Regel zweimal, also werde ich diese einfach auskommentieren. Ich klicke auf „Speichern“, aktualisiere hier drüben. Sie können sehen, dass der blaue Hintergrund nur für den geschlitzten Inhalt gilt. Es gilt nicht für die Spanne innerhalb des Shadow-DOM. Wir können diese Farbe nicht über das Licht-DOM ändern , es sei denn , wir verweisen natürlich auf diese Variablen. Wenn du jemals verloren bist, verbinde ich euch diesem Tisch gleich hier. Ich lege jetzt einen Link auf deinen Bildschirm, damit du ihn dir ansehen kannst , wenn ich diesen Kurs veröffentliche. Aber im Wesentlichen geht es im Shadow DOM hauptsächlich um CSS. Es ist eine Möglichkeit für uns, das CSS eines Elements zu reparieren, vielleicht wenn wir Elemente über verschiedene Projekte hinweg teilen und wir wollten, dass das Element genau gleich aussieht, egal in welchem Projekt es sich befand, das Shadow DOM würde sich als nützlich erweisen. Aber innerhalb Ihrer eigenen privaten Anwendungen und Webseiten bin ich mir nicht sicher, ob das Shadow-DOM zu benötigt wird, weshalb wir es am Ende dieser Klasse nicht im praktischen Beispiel verwenden werden. Es ist jedoch in Webkomponenten beliebt daher war es wichtig, diese Lektion im Shadow DOM zu lernen . Wie immer wird dies alles für GitHub gebunden sein, sodass Sie diesen Code später erwarten können. Ich werde diese Tabelle natürlich mit dir teilen, aber das fasst das Shadow-DOM ziemlich zusammen. wir im nächsten Video über Slots und Vorlagen. 7. Slots und Vorlagen: Willkommen zurück Leute. In diesem Video werden wir über Slots und Vorlagen sprechen , die ziemlich einfach sind. Wir haben bereits einen Slot im vorherigen Video verwendet. Wir haben es hier in etwas Inhalt eingefügt. Grundsätzlich haben wir eine Spanne innerhalb dieser Webkomponente verschachtelt und konnten dann wählen, wo sie in diese spezielle HTML-Struktur innerhalb unseres Schatten-DOM gleiten soll . Wenn Sie sich das im eigentlichen Browser ansehen, können Sie sehen, dass wir unsere Schattenwurzel hier haben. Wenn ich in das Div gehe und hier in diesen geschlitzten Inhalt gehe, kannst du sehen, dass es einen Link zu dem eingelegten Inhalt gibt , der genau hier ist. Es ist eine seltsame Sache, bei der es technisch gesehen nicht Teil des Schatten-DOM ist, aber es wird hier über dieses Slot-Tag in das Schatten-DOM eingefügt. Jetzt haben wir bereits gesehen, dass in der Praxis als Nächstes die Slots zu nennen ist, wenn wir also mehrere Slots innerhalb einer bestimmten Webkomponente verwenden möchten . Um dies zu demonstrieren, entferne ich den gesamten Code, den wir für diese Demonstration nicht wirklich benötigen. Auch hier können wir den getrennten Callback verlassen, aber ich werde dieses Attribut hier loswerden . Werde das los. Dann werde ich das Attribut los, wie es hier im HTML existiert. Ich schaffe hier eine weitere Spanne. Dann schreibe ich, dass diese Spanne auch eingeschlitzt wurde. Wenn ich auf „Speichern“ klicke, lass uns sehen, was jetzt passiert. Wenn ich die Seite aktualisiere, siehst du dass sich zwei Spannweiten in diesem einen Slot befinden. Was wir jedoch über Namensschlitze tun können, ist, diese beiden Spannweiten in verschiedene Teile derselben HTML-Struktur zu integrieren diese beiden Spannweiten in verschiedene Teile . Was meine ich damit? Nun, gehen wir hier zu unserer Datei component.js und lassen Sie uns das ändern. Sagen wir einfach, wir haben zwei Divs. Das erste div wird ein **** für die erste Spanne haben und lassen Sie uns ein anderes Div erstellen, das von diesem div getrennt ist und innen die zweite Spanne sein wird, die ich in meine Webkomponente einlege anderes Div erstellen, das von diesem div getrennt ist und innen die zweite Spanne sein wird . Sobald wir diese Slots benennen, wird diese Spanne in den ersten Slot gehen und diese Spanne wird in den zweiten Slot gehen. Wir können entweder im HTML-Dokument oder im JavaScript-Dokument beginnen . Ich fange hier im JavaScript an, alles was ich tun muss, ist den Slot zu benennen, indem ich den Namensparameter hier hinzufüge den Namensparameter hier und dann werde ich es einfach Slot 1 nennen. Dann gehe ich zum zweiten Slot und nenne ihn Slot 2. Dann in unserer index.html, um diese zu verknüpfen werde ich den Slot-Parameter verwenden, und ich werde diesen Namen wieder verwenden, also Slot 1 und dann ist und ich werde diesen Namen wieder verwenden, also Slot 1 Slot gleich Slot 2. Wenn ich jetzt auf „Speichern“ klicke und hier aktualisiere, was denkst du, dass es passieren wird? Lasst uns auffrischen und schauen wir uns mal hinein. Wie Sie sehen können, haben wir unsere beiden geschlitzten Elemente hier drüben, aber in Bezug darauf, wo sie in unsere Schattenwurzelstruktur passen , öffnen wir diesen Bad Boy und wir können sehen, dass wir zwei Divs haben. Im ersten Div haben wir den ersten Sloting-Inhalt, und im zweiten div haben wir den zweiten Sloting-Inhalt. Jetzt sind sie in separaten Divs und wir brauchen das vielleicht für alles, was wir mit unserer HTML-Struktur tun müssen, also Styling und was nicht. diese Weise können wir mehrere Dinge in verschiedene Teile unserer Schatten-DOM-Struktur einfügen. Daran folgt das nächste, was ich Ihnen zeigen möchte , sind Vorlagen. Ich werde diesen Code genau hier entfernen [NOISE], dann füge ich einen HTML-Code ein, die Stilregeln und ich gehe hier zurück zu index.html. Ich gehe hier rein und entferne diesen Inhalt, denn wir werden Inhalte in eine Vorlage einfügen und diesen Inhalt dann in die Webkomponente bringen. Wir können das auf zwei Arten machen. Ich bin sicher, dass wir es auf verschiedene Arten machen können, aber es gibt zwei Möglichkeiten, wie ich es dir in diesem Video zeige. Wir könnten das Template-Tag außerhalb der Webkomponente platzieren. In diesem Fall geben wir ihm einen Ausweis. Ich nenne es einfach Vorlage der Einfachheit halber. Dann erstellen wir hier unsere Vorlage. Ich mache einfach ein h1 und sage, dass dieser Vorlagencode die Webkomponente ausmacht. Dann erstelle ich ein Absatz-Tag und verwende Emmet in Visual Studio Code, ich kann Lorem hit „Tab“ eingeben und es wird Lorem Ipsum automatisch generieren. Ich repariere nur den Abstand hier, damit ihr den gesamten Absatz sehen könnt. Hit „Speichern“ drauf. Da es sich um ein Vorlagen-Tag handelt, wird es zur Laufzeit nicht gerendert. Wenn ich wieder hierher gehe, führe den Code aus, du wirst sehen, dass wir unseren Vorlagencode hier haben. Wir haben dieses Dokumentfragment hier, also haben wir den Code in unserem HTML, aber nichts wird gerendert und das liegt daran, dass es sich in einem Template-Tag befindet, was bedeutet, dass es nicht gerendert wird , wenn wir nicht nehmen diese Vorlage codieren und rendern Sie es mit JavaScript. Genau das mache ich gleich. Ich gehe hier zurück zu unserem Code-Editor und gehe zu component.js. Was ich tun werde, ist, nachdem wir unseren inneren HTML hier festgelegt haben, das nur das Style-Tag ist, was ich tun werde, ist, diesen Vorlagencode zu finden. Wie ich das machen kann, ist der Dokumentabfrage-Selektor. Im Grunde möchte ich dieses Element nur finden. Es war eine Vorlage mit der ID der Vorlage. Deshalb habe ich Hash davor gelegt. Dann finde ich den Inhalt davon und führe dann Clone Node mit dem Parameter true aus. Mit dem Parameter „true“ , der einen tiefen Klon darstellt, alle Unterelemente innerhalb werden auch alle Unterelemente innerhalb der Vorlage gerendert. Ich kann mir nicht wirklich eine Situation vorstellen, in der Sie hier falsch laufen möchten. Lassen Sie es uns einfach wahr halten. Natürlich müssen wir das etwas benutzen. Ich werde es in einer Variablen speichern, eine Konstante zuerst. Jetzt haben wir unsere const-Vorlage. Es sieht so aus, als hätte ich das versehentlich außerhalb der Konstruktorfunktion platziert , also werde ich das wieder dort hineinlegen. Tut mir Leid. Mit dieser Vorlage kann ich geklonten Knoten an den Shadow-Root anhängen. Ich werde hier die Schattenwurzel greifen und führe ein Kind anhängen aus, indem ich diesen Vorlagencode als Argument darin platziere. Aktualisieren wir die Seite hier drüben und sehen, was passiert. Sie können sehen, dass der Vorlagencode jetzt in unserer Webkomponente ausgeführt wird. Wenn ich hier in den Code der Webkomponente gehe, kannst du sehen, dass wir unseren Schattenstamm haben und innerhalb der Schattenwurzel haben wir das Style-Tag, das wir festlegen, indem den inneren HTML explizit festlegen. Dann haben wir das h1- und p-Tag, das wir in der Vorlage festgelegt haben. Was wir auch tun können, um dies ein bisschen einfacher und eingekapselter zu gestalten ein bisschen einfacher und eingekapselter , ist das Template-Tag in die Webkomponente selbst zu legen . Ich kopiere das einfach und kommentiere es dann aus. Gehen wir in die Webkomponente. Da wir uns jetzt in der Webkomponente befinden, können wir einfach auf das Vorlagenelement verweisen , anstatt eine ID zu haben. Ich werde „Speichern“ drücken und dann zu unserem Code gehen, dann zu unserem Code gehen und was wir stattdessen tun können, ist diesen Hash wegzunehmen. Anstelle von Dokumenten können wir das sagen. Dies wird jede Vorlage in unserer Webkomponente nachschlagen. Ich werde auf „Speichern“ klicken, hier aktualisieren, und du siehst, dass wir genau das gleiche Ergebnis erhalten. Sie können sehen, dass sich die Vorlage in der Webkomponente befindet und dann der Code, den wir in dieser Vorlage hatten innerhalb des Schatten-DOM geklont wurde. Dies funktioniert genauso, als würden wir das Schatten-DOM überhaupt nicht verwenden. Entfernen wir einfach das Schatten-DOM vollständig. Eigentlich werde ich es einfach kommentieren weil ich denke, dass wir es im nächsten Video verwenden könnten. Hängen wir es einfach an das eigentliche innere HTML an. Aktualisieren Sie hier drüben und Sie werden sehen, dass es nicht angehängt wird, und das liegt daran, dass wir hier immer noch Schattenwurzel haben. Diese Append-Kind-Aktualisierung hier drüben. Wieder funktioniert nicht. Was haben wir gemacht? Eigenschaften von null können nicht gelesen werden. Ich glaube, das Problem hier ist, dass wir in unserem HTML explizit festgelegt haben , was den HTML-Inhalt innerhalb der Webkomponente, die wir hier platziert haben, auslöscht den HTML-Inhalt innerhalb der , nämlich nur dieses Template-Tag. In diesem Fall würde ich hier rübergehen und das einfach loswerden und das einfach loswerden stattdessen direkt in die Vorlage legen, was ohnehin etwas sauberer ist. Lassen Sie uns darauf „speichern“ und dann neben der Vorlage füge ich das Style-Tag direkt in unseren HTML-Code ein. Ich habe bei dieser Aktualisierung hier auf „Speichern“ geklickt und das Problem ist jetzt verschwunden. Je nachdem, wie Sie es machen möchten, sieht das tatsächlich ziemlich sauber aus, da wir überhaupt keinen HTML-Code in das JavaScript einfügen. Wir fügen den gesamten HTML-Code und die Stile, die enthalten sind, in unsere Webkomponente ein. Da wir jedoch kein Schatten-DOM mehr verwenden, gelten diese Stile theoretisch für alles. Wenn wir hier reingehen und eine Spanne setzen, sagen Sie, dass dies eine Spanne ist. Aktualisieren Sie hier drüben. Die Stile aus unserem leichten DOM, die wir hier oben haben , und unsere Stile hier in der Webkomponente gelten beide. Wenn ich mir das ansehe, schauen wir uns diese besondere Spanne hier an. Sie können sehen, dass die blaue Hintergrundfarbe und die gelbe Hintergrundfarbe beide zutreffen. Aber da dies später im Dokument geschieht, überschreibt es dieses hier. Im Wesentlichen ist es für uns keinen Sinn, hier ein Style-Tag zu haben , wenn wir beabsichtigen, dass dies nur für die Webkomponente gilt . In diesem Fall möchten wir beim Schatten-DOM bleiben. Ich gehe einfach hier und zurück hier drüben. Lasst uns das Schatten-DOM behalten und hier aktualisieren. Wenn ich unserer Vorlage hier eine Spanne hinzufügen würde, aktualisieren Sie es. Untersuchen Sie dieses Element. Sie können sehen, dass keiner der Stile aus dem hellen DOM hier angewendet wird, da dieser Vorlagencode in ein Schatten-DOM gelegt wird und daher nur die Stile, die wir in unserer Schattenwurzel haben wird sich darauf bewerben. Ziemlich einfache Vorlagen hier, viel Flexibilität darin, aber im Wesentlichen müssen wir nur ein Vorlagen-Tag erstellen, und dann werden wir im Grunde genommen diese Vorlage finden schauen Sie sich seinen Inhalt an und führen Sie Clone Node aus, um einen DOM-Knoten oder DOM-Subtree basierend auf dieser Vorlage zu erstellen einen DOM-Knoten oder DOM-Subtree basierend auf , und dann können wir ihn überall in unserer Webkomponente anhängen , entweder an den Schattenstamm oder an das innere HTML direkt. Das umfasst Slots und Vorlagen. Im nächsten Video werden wir kundenspezifische integrierte Elemente behandeln. 8. Benutzerdefinierte integrierte Elemente: Alles klar Leute. In diesem Video werden wir kundenspezifische integrierte Elemente behandeln. Bis zu diesem Zeitpunkt haben wir das Root-HtmlElement erweitert. Aber jetzt werden wir ein bestimmtes HtmlElement erweitern, und dies wird als Erstellen eines benutzerdefinierten integrierten Elements bezeichnet . Was ich also tun werde, ist all diesen Code zu entfernen , weil wir ein ganz neues Element erstellen und weil ich das mache, gehe ich hier in meinen Index und entferne auch diesen ganzen Code. Wir könnten genauso gut alles in unserem Style-Tag entfernen. Wir haben hier eine ziemlich saubere Weste. Um ein benutzerdefiniertes integriertes Element zu demonstrieren, werde ich das HTML-Button-Element erweitern. Was wir also tun werden , ist unseren eigenen benutzerdefinierten Button zu erstellen . Also beginnend auf die gleiche Weise, wie wir es normalerweise tun würden, indem wir die Klasse schreiben, und dann rufe ich mein benutzerdefiniertes Button-Element auf, buchstäblich nur CustomButton. Dann schreibe ich Extends und anstatt HtmlElement zu schreiben, mache ich HtmlButtonElement. Wenn Sie jetzt einen Code-Editor oder eine IDE wie Visual Studio Code verwenden , können Sie sehen, nachdem ich HTML eine ganze Liste all dieser verschiedenen Elemente, die ich verwenden kann. Das Format ist im Grunde HTML, der Name des Elements und dann Element. Also kann ich ein Überschriftenelement erweitern. Ich kann hier ein Bildelement, ein Eingabeelement, eine Beschriftung, einen Link und so viele verschiedene Optionen erweitern ein Eingabeelement, eine Beschriftung, . Wenn Sie also die verschiedenen Optionen durchsuchen müssen, sind Sie sich nicht sicher, wie der Klassenname lautet, dann hilft das wirklich. Aber was ich suche, ist ein HtmlButtonElement, also werde ich das treffen. Dann lasst es uns öffnen, wie wir es beim letzten Mal getan haben. Ich schreibe unsere CustomElements define-Methode, wie wir es zuvor für Standard-Webkomponenten getan haben , und ich mache den Tag Custom-Button. Als zweites Argument werden wir diese Klasse wie immer einbringen, aber hier wird es wieder anders. Wir müssen ein drittes Argument vorbringen. Wir müssen ein JavaScript-Objekt mit einem Schlüssel-Wert-Paar einfügen. Der Schlüssel wird erweitert und der Wert ist das Tag des Elements, das wir erweitern. Für eine HTML-Schaltfläche ist das Tag natürlich eine Schaltfläche. Wenn ich das im HTML schreiben würde, wird es so sein, als würdest du im Grunde das Wort nehmen , das zwischen dem Zeichen weniger als und größer als liegt, und es nach den Ausführungen dem Zeichen weniger als und größer als genau hierher setzen. Wenn dies zum Beispiel ein benutzerdefinierter Link war, lassen Sie mich betrügen, indem ich dort die automatische Vervollständigung verwende. Wenn wir Ihr HTML-Link-Element erweitern würden, würde sich dies in „a“ ändern, da das Anker-Tag so im HTML dargestellt wird. Aber wir machen Button, also gehe ich zu Control Z, bis wir wieder zum Button kommen. So wie wir es zuvor mit Standard-Webkomponenten getan haben , werde ich hier einen Konstruktor erstellen und dann natürlich super laufen , damit wir die Konstruktorfunktion erben können der Klasse, die wir erweitern, die HtmlButtonElement war. Was ich dann mache, ist hier zu unserer index.html zu gehen und etwas HTML zu schreiben. Lassen Sie uns tatsächlich dieses benutzerdefinierte integrierte Element erstellen. Die Art und Weise, wie wir das tun, unterscheidet sich von Standard-Webkomponenten. Wir werden tatsächlich den ursprünglichen Namen des Elements verwenden , das wir anpassen. Es wird Button sein. In diesem Button schreibe ich einfach, drücke mich und dann hier drin, um es in unser benutzerdefiniertes integriertes Element zu machen unser benutzerdefiniertes integriertes Element und nicht nur eine Standardschaltfläche, wir werden das Attribut von is verwenden. Dann hier drin, custom-button, der mit dem übereinstimmt, was wir im ersten Argument unserer definierten Methode hier geschrieben haben . Wenn ich hierher zurückkomme, was ich für dieses Beispiel tun könnte , ist, dass ich einen Link einfüge. Ich füge ein benutzerdefiniertes Linkattribut ein und lass es uns einfach auf google.com gehen. Das wäre also vielleicht wie das Standardverhalten eines Link-Tags. Also würden wir href schreiben, und wenn wir dann auf den Link klicken, würde es zu dieser spezifischen URL gehen. In diesem Fall, wenn ich das gerade mache und hier zu unserem Code zurückkehre und auf „Drücken Sie mich“ klicke, wird nichts passieren, da dies ein benutzerdefiniertes Attribut ist. Es wird nichts tun, es sei denn, wir schreiben hier etwas Code in unsere Komponente, um damit umzugehen. Genau das werde ich als Nächstes tun. Ich werde diesen Wert also greifen.getAttribute. Dann gebe ich den Attributnamen in ihren Link und dann werde ich das natürlich irgendwo aufbewahren. Ich werde es in der Webkomponente selbst speichern, also werde ich sagen, dass dies.link dem Wert von dies.getAttribute Link entspricht . Wenn ich wollte, könnte ich es auch tun, wenn dies ein Attribut hat wie zuvor, aber ich gehe einfach davon aus, dass es das hat, weil ich die Kontrolle habe , diesen Code zu schreiben, und ich werde vergewissern Sie sich, dass es dieses Attribut hat. Was ich dann mache, ist, dass ich einen Event-Listener einrichten werde. Wenn auf dieses Element geklickt wird, klicken Sie also auf „Ereignis“, dann führe ich diesen Code aus. Was ich tun werde, ist, den Fensterspeicherort href auf den Wert von this.link zu ändern . Was wir hier getan haben, ist, dass wir den Wert innerhalb des Link-Attributs genommen , in dieser Variablen gespeichert und dann einen Ereignis-Listener für das Klickereignis auf dieser benutzerdefinierten Schaltfläche erstellt haben einen Ereignis-Listener für . Wenn darauf geklickt wird, wird der Benutzer zu dem umgeleitet , was wir in diesem Link-Attribut gespeichert haben. Also lasst uns testen, ob das funktioniert. Jetzt werde ich hier aktualisieren und klicke auf „Drücken Sie mich“, und wie Sie sehen können, gehen wir zu google.com. Auch hier nicht das praktischste Beispiel, weil wir dafür einfach ein Link-Tag hätten verwenden können. Aber lassen Sie mich dieses Beispiel ein wenig weiter ausdehnen. Da wir hier ein Element haben, das das gesamte ursprüngliche Verhalten eines Button-Elements erbt , müssen wir möglicherweise verhindern, dass es sich wie eine Schaltfläche verhält. Ein Beispiel dafür wäre, wenn es sich in einem Formular befand. Ich werde hier ein Formular haben und setze die Aktion als Beispiel auf Endpunkt. Dies wird das Formular offensichtlich ins Nirgendwo schicken , weil ich eigentlich keinen Endpunkt habe. Das nennt man Endpunkt. Wenn ich dann auf „Speichern“ klicke und hier aktualisiere und auf „Drücken Sie mich“ klicke, werden Sie sehen, dass es das Verhalten einer Schaltfläche in einem Formular erbt , das das Formular absenden soll. Hier können Sie also sehen, dass wir hier zu diesem Endpunkt gehen , der nicht existiert. Das ist natürlich anders als wenn ich ein Link-Tag hätte, weil wir ein Link-Tag haben, Nummer 1, es würde nicht so aussehen, weil es kein Button ist. Nummer 2, ein Link-Tag löst keinen Gipfel eines Formulars aus, wenn es sich innerhalb eines Formulars befindet. Was wir also tun können, ist, dass ich hier zu component.js gehen kann und ich kann event.PreventDefault gehen. Es ist bei dieser Aktualisierung hier gespeichert. Wenn ich darauf klicke, obwohl es sich in einem Formular befindet, wird es dieses obwohl es sich in einem Formular befindet, Standardverhalten verhindern und dann wird es das tun, was wir ihm gesagt haben, nämlich den Benutzer umzuleiten auf welche Adresse im Link-Attribut auch immer die Adresse lautet. Gehe hierher zurück, nur um dieses Haus zu bohren, wenn ich einen Standardknopf einsetzen würde , der nicht eines unserer benutzerdefinierten Einbauelemente war , der nicht eines unserer benutzerdefinierten Einbauelemente und sagen, dass du mich auch drücken kannst und dann aktualisiere ich hier drüben. Wenn ich auf das klicke, kannst du mich auch drücken, wird sich wie eine Standardschaltfläche verhalten und das Formular absenden. Da wir diese andere Schaltfläche jedoch angepasst haben , um den Standardwert zu verhindern und stattdessen den Benutzer auf google.com umzuleiten, wird er sich anders verhalten. Hoffentlich nicht das praktischste Beispiel, aber hoffentlich kommuniziert dies was wir mit Elementen machen können. Wir können einige der Verhaltensweisen und Attribute eines Elements verwenden, das uns gefällt, und wir können sie an unsere Zwecke anpassen. Offensichtlich gibt es hier wahnsinnige Flexibilität. Sie können dies in jede Richtung gehen, die Sie wollen, aber das werden wir nicht besonders im praktischen Bereich dieser Klasse verwenden, nur etwas, das Sie beachten sollten, weil es fällt unter der Web-Komponenten-Spezifikation. Wir können hier bestimmte Elemente erweitern, und dies wird als kundenspezifische integrierte Elemente bezeichnet. Leute, im nächsten Video werden wir also die endgültige Spezifikation abdecken, werden wir also die endgültige Spezifikation abdecken über die wir noch nicht gesprochen haben, nämlich die ES-Modulspezifikation. Wir sehen uns im nächsten Video. 9. ES: Leute, also sprechen wir in diesem abschließenden Video, bevor wir in unser praktisches Klassenprojekt einsteigen, in unser praktisches Klassenprojekt einsteigen, über ES-Module, die die vierte Spezifikation innerhalb der Meta-Spezifikation der Webkomponenten ist . ES-Module sind im Wesentlichen eine Möglichkeit für uns , unser Projekt anders zu strukturieren. Wir können jede unserer Komponenten in eine eigene modulare JavaScript-Datei einfügen und sie dann in eine andere JavaScript-Datei einbringen und diese JavaScript-Datei dann in unser HTML-Dokument bringen. Oder alternativ können wir einfach jede Komponente ohne diese Datei in unser HTML-Dokument einbringen . Aber in den Beispielen, die ich Ihnen zeigen werde, importiere ich alle Komponenten in eine einzige JavaScript-Datei, und dann werden wir diese in unser HTML-Dokument einfügen. Einige Projekte, das wird sehr hilfreich sein, einige Projekte werden überhaupt keinen Sinn ergeben. Wir werden ES-Module in der Praxis verwenden , die nach dieser Lektion kommt. Dies wird etwas sein, das wir sehr bald in Aktion sehen werden , aber lassen Sie uns für diese Lektion ES-Module tatsächlich demonstrieren. Wie gesagt, was ich tun werde , ist, dass ich alle unsere Komponenten importieren werde , Moment gibt es nur eine aber ich werde eine zweite in eine zentrale JavaScript-Datei machen , und ich werde nenne das hier index.js. Was ich jetzt tun werde, um uns zum Einstieg zu bringen, schließen wir das, damit wir das Ganze sehen können, ist, dass ich diese benutzerdefinierte Elemente-Methode hier verschieben und diese in unsere index.js verschieben werde . Damit wir hier Zugang zu dieser Klasse haben, muss ich sie von hier aus exportieren und dann hier importieren . Erstens, weil wir hier nur die eine Klasse haben, werde ich keinen benannten Export machen, einen unbenannten Export durchführen. Ich exportiere einfach Standard und dann den Klassennamen, den ich exportieren möchte. Was das bedeutet, ist, dass es nur diese Klasse exportiert, also kann ich, sobald ich sie hier importiert habe, direkt in unserem Code hier referenzieren. Ich führe die Importanweisung hier aus, wir suchen nach einer benutzerdefinierten Schaltfläche und füge dann nach dem Schlüsselwort von hier nach dem Schlüsselwort von hier den Pfad zur Datei ein. Nun, da ich das getan habe, muss ich den Code hier aktualisieren, also stelle ich anstelle von component.js index.js ein. Wie wir in der Theoriestunde gesehen haben, muss ich das Attribut hier des Typmoduls ändern oder hinzufügen . Darauf klicke ich „Save“. Lasst uns hier drüben auffrischen. Wir sollten sehen, dass wir diese Schaltflächen immer noch haben , aber wenn ich auf das erste klicke, das unser benutzerdefiniertes integriertes Element ist, können Sie sehen, dass wir die gleiche Funktionalität wie eine Standardschaltfläche haben . Beide sind genau gleich. Der Grund liegt genau hier in unserer JavaScript-Konsole. Wir haben hier einen CORS-Richtlinienfehler und der Grund dafür ist wir dies nicht wirklich tun können den HTML-Code aus dem Dateisystem ausführen. Was wir tun müssen, ist einen Server zu betreiben. Das ist im Visual Studio-Code sehr einfach. Hoffentlich ist es auch in Ihrer IDE einfach und einfach genug. Wenn nicht, können Sie immer einfach Visual Studio Code verwenden und ich gehe einfach hier runter und klicke auf Go Live. Jetzt können Sie sehen, dass wir einen Server betreiben. Ich kann das sehen, weil wir hier eine IP-Adresse haben und nicht einen Pfad aus dem Dateisystem. Wenn ich nun die Befehlsoption I drücke, um die Konsole aufzurufen, sehen Sie keine Fehler und wenn ich auf „Drücken Sie mich“ klicke, bringe ich zu Google nicht zu dem Endpunkt , nach dem es hier sucht. Ich schließe das im Dateisystem und wir benutzen einfach dieses. Hier können Sie sehen, dass das alles bereits funktioniert. Wir haben Code aus component.js in index.js importiert und dann haben wir ihn in index.html importiert . Aber das wird nicht wirklich sinnvoll sein, und deshalb haben wir eine andere Komponente erstellt. Ich erstelle hier eine zweite Komponente. Das ist eine schreckliche Benennung, aber ich nenne es einfach Komponente-2. Weißt du was? Lassen Sie uns nur zum Spaß ein weiteres benutzerdefiniertes integriertes Element erstellen. Ich schreibe Klasse und lass uns das Link-Element erweitern , um einen benutzerdefinierten Link zu erstellen. Ich schreibe benutzerdefinierten Link erweitert HTML, Ankerelement. Öffne das hier drin, offensichtlich setze ich den Konstruktor. Dann rufe ich super an, wie wir es immer getan haben. Was ich dazu tun könnte, ist Event-Listener für Klick hinzuzufügen, [NOISE] dies ähnelt dem, was wir zuvor gemacht haben, aber jetzt haben wir das Standardverhalten eines Anker-Tags. Was ich tun werde, ist dies im Grunde zu einem Bestätigungslink zu machen. Ich führe Confirm aus und bitte den Benutzer , zu bestätigen, dass er Google verwenden möchte. Sie möchten Google verwenden, und wenn das dann so falsch ist, wie Sie hier aus diesem Ausrufezeichen sehen können, dann verhindere ich den Standardwert. Ich werde verhindern, dass der Benutzer diesen Link verwendet. Ziemlich einfaches Beispiel dort. Dann exportiere ich das natürlich, und da wir nur eine Klasse exportieren, kann ich hier Standard verwenden. Wir exportieren einen benutzerdefinierten Link, und dann gehen wir in index.js und verwenden das gleiche Format. Ich importiere die benutzerdefinierte Schaltfläche aus component2.js und dann schreiben wir unsere definierte Methode hier unten, also benutzerdefinierte Elemente, definiere, nenne es benutzerdefinierten Dash-Link. Dann setzen wir den Klassennamen ein, ist das zweite Argument. Dann werden wir in unseren Ausführungen hier das Standardankerelement erweitern, das nur als im HTML dargestellt wird. Wenn ich dann zu meiner index.html gehe, importieren wir bereits all diesen Code. Alles was ich tun muss, ist einfach ein Tag hier zu schreiben. Lass es uns wieder zu Google gehen. Um die Funktionalität dieses benutzerdefinierten eingebauten Elements zu übernehmen, muss ich natürlich schreiben und dann innerhalb des schreiben Attributs is in den Namen eingeben, den wir angeben, welcher ist ein benutzerdefinierter Link und dann klicke ich einfach mit der rechten Maustaste , um zu Google zu gehen. Hit „Speichern“ drauf. Lasst uns hier drüben auffrischen. Sie können den Link dort sehen. Wir mussten nicht einmal aktualisieren, da wir Live Server verwenden, der nur eine Funktion in Visual Studio Code ist. Dies nennt man „Hot Reloading“. Wenn ich dann darauf klicke, frage ich mich, ob ich auf jeden Fall zu Google gehen möchte. Wenn ich auf „Abbrechen“ klicke, wird das Standardverhalten verhindert, das mich an diese Adresse weiterleitet. Aber wenn ich darauf klicke und auf „Okay“ klicke, wird es mich dorthin leiten. Die Funktionalität innerhalb der eigentlichen Komponente selbst ist hier jedoch nicht der Punkt. Der Punkt ist, dass wir Klassen aus JavaScript-Dokumenten in andere JavaScript-Dokumente und mithilfe von ES-Modulen in HTML-Dokumente exportieren JavaScript-Dokumenten in andere JavaScript-Dokumente und können. Hoffentlich ist das ein cooles Konzept für euch, das ihr gerade gelernt habt. Im nächsten Video werden wir damit beginnen, dies als praktische Anwendung auszubauen . In diesem Video, vielleicht mehrere Videos, je nachdem, wie lange wir dauern, werden Sie sehen, dass wir ES-Module in Aktion verwenden, und so werden Sie es in den nächsten Videos ein bisschen mehr in der Praxis sehen . Das sind im Grunde alle vier Spezifikationen für die Meta-Spezifikation der Webkomponente. Lassen Sie uns dies im nächsten Video in die Praxis umsetzen und unser eigenes individuelles Projekt erstellen. 10. Web-Komponenten in der Praxis Teil 1: Alles klar, allerseits. Willkommen im praktischen projektbasierten Teil der Klasse. Ich bekomme regelmäßig das Feedback von euch, dass ihr praktischere Beispiele sehen wollt. In diesem Kurs haben wir bisher nicht zu viele von ihnen gesehen, wenn ich ehrlich bin. Ohne dass ein paar Webkomponenten zusammenarbeiten und ohne Anwendungsfall sind, ist es schwierig, tatsächliche praktische Anwendungsfälle von Webkomponenten und viele dieser Spezifikationen zu demonstrieren , die Sie nicht verwenden müssen auf der einen Zeit. Zum Beispiel verwende ich in diesem Projekt, das wir gerade erstellen werden, das Shadow DOM überhaupt nicht weil ich es nicht verwenden muss, es sei denn ich versuche mein Shadow DOM getrennt zu halten und was ich damit meine trennen Sie wie im separaten CSS-Styling auf den Rest meines Projekts. Wenn ich die Kontrolle über mein eigenes Projekt habe, dann habe ich nicht wirklich das Bedürfnis, ein Shadow-DOM erstellen zu müssen, weil ja, vielleicht möchte ich, dass die Stile aus dem Light DOM das Shadow-DOM beeinflussen. Mischen und passen Sie die Funktionen aus Spezifikation an, die für Sie sinnvoll ist. Ich hoffe, dass Sie in dieser Klasse ein paar gute Grundlagen gelernt haben , aber ich wollte eine praktischere projektbasierte Lektion für euch aufnehmen . Dies muss wahrscheinlich in mehrere Lektionen aufgeteilt werden , sodass dies möglicherweise als mehrere Videos innerhalb dieser Skillshare-Klasse angezeigt werden kann. Aber was ich tun möchte, ist ein praktisches Beispiel zu erstellen, das praktischste Beispiel, das ich mir vorstellen kann und das praktische Beispiel verwenden, das wir früher in der Klasse mit dem E-Commerce-Beispiel über Shopify gesehen haben früher in der Klasse mit dem E-Commerce-Beispiel über Shopify um unser eigenes von E-Commerce inspiriertes kleines Projekt zu erstellen, und wenn Sie dieses Projekt weiterführen möchten, verwenden Sie es als Inspiration für etwas, das Sie in der realen Welt verwenden möchten. Fühlen Sie sich frei, dies zu tun. Aber anstatt mehr darüber zu reden, möchte ich einfach direkt hineinspringen und euch mitverfolgen lassen , was ich hier kreiere. Für dieses Projekt werde ich alles in Git festschreiben damit Sie sich diesen Code später ansehen und Ihren Code damit vergleichen können . Das war auch in der Vergangenheit eine Kritik an einigen meiner Klassen, ist, dass ihr den Code nicht wirklich außer in den Videos betrachten könnt. Ich habe euch auch dabei zugehört, und deshalb werde ich mich verpflichten und ihr könnt euch diesen Code auf GitHub ansehen , nachdem dieser Kurs veröffentlicht wurde, und deinen Code mit meinem vergleichen. Sie uns kurzerhand Lassen Sie uns kurzerhand darauf eingehen. Ich erstelle hier im Codeordner einen Projektordner , in dem wir den anderen Ordner erstellt haben. Ich nenne diesen einen Einkaufswagen. Rufen Sie dann Visual Studio-Code auf, greifen Sie dann diesen Ordner, ziehen Sie ihn in Visual Studio-Code und daher weiß ich, dass ich diesen bestimmten Ordner öffne. Offensichtlich werde ich dies auf die volle Breite Ihrer Betrachtung ausdehnen . Los geht's und fangen wir mit unserem Boilerplate-Inhalt an. Also erstelle ich eine neue Datei mit index.html. Dasselbe wie in der Vergangenheit: Verwenden Sie das Ausrufezeichen, um ein HTML-Dokument auszugeben. Nennen wir diesen Einkaufswagen. Dann werde ich einige Assets, CSS und Image-Assets kopieren, weil diese Klasse nicht wirklich auf CSS ist, und natürlich werde ich Sie nicht dazu bringen, Ihre eigenen Bilder zu bekommen, also werde ich es tun CSS und Image-Assets kopieren, weil diese Klasse nicht wirklich auf CSS ist, und natürlich werde ich Sie nicht dazu bringen, Ihre eigenen Bilder zu bekommen, bring die sofort rein. Werfen wir einen kurzen Blick darauf damit Sie wissen, was los ist. Ich habe gerade eine styles.css Datei hier und es hat nur einen Haufen anderen Codes. Dieser ist überflüssig. Aber wir haben hier eine Menge unterschiedlichen Codes, nur um unser Projekt gut zu gestalten. Auch hier konzentrieren wir uns nicht wirklich auf Stile in dieser Klasse, aber es ist viel besser, ein Projekt zu haben , das gut gestaltet ist als ein hässliches. Also habe ich das da drin und dann habe ich hier Bilder, zufällige Produkte. Dies sind zufällige Produktbilder, wie Sie sehen können. Sie sehen alle optisch ähnlich aus, aber es gibt keinen Zusammenhang zwischen Cola Zero und Hanfsamenöl und Red Curry Paste. Ein bisschen zufällig, aber wir brauchten nur ein paar Platzhalterbilder für dieses Projekt. Ich erstelle auch einen JavaScript-Ordner. Klicken Sie zunächst auf „Neuer Ordner“, „js“. In diesem js-Ordner erstelle ich eine index.js. Was ich hier machen werde, ist, weil wir einen Einkaufswagen bauen, ich werde ein Objekt auf dem Fensterobjekt erstellen. Es wird ein globales Objekt namens cart sein, und dann öffne ich ein leeres Objekt, und ich weiß, dass ich in diesem Objekt eine Reihe von Elementen haben möchte , also initialisiere ich das gerade hier. Ich drücke dabei auf „Speichern“, und dies wird wahrscheinlich mein erstes Commit sein. Ich bringe hier ein Terminal auf, führe Git init aus, git add. und dann Git Commit anfängliches Commit. Klar das, und was ich tun werde, ist, dass ich versuchen werde , immer wieder zu verpflichten , damit ihr den Fortschritt sehen könnt und auf den Code verweisen könnt, wenn du willst. Wir haben diesen **** DS Store hier. Ich werd das einfach verwerfen, brauche das nicht wirklich. Zurück zu unserem Code hier, machen wir unseren ersten Schritt zur Erstellung dieses Projekts. Bevor wir das tun, klicken wir tatsächlich auf „Go Live“. Jetzt wirst du sehen, dass wir unsere Datei index.html ausführen. Wir müssen auch diese Stile laden , also hätten wir das wahrscheinlich vor meinem ersten Commit tun sollen. Aber los geht's, link rel="stylesheet“ und dann lautet der Pfad zu diesem Stylesheet css/styles.css. Bevor wir nun irgendeine Funktionalität erstellen, erstelle ich hier nur etwas HTML, also erstellen wir ein Div mit der Containerklasse, ziemlich Standardsachen und dann h1 Einkaufswagen. Was ich dann machen werde, ist ein Div mit der Klasse der zum Verkauf stehenden Produkte, und dann werde ich hier vier Divs erstellen, also div mal 4. Lasst uns dabei auf „Speichern“ klicken. Schauen wir uns hier an, dann können Sie sehen, ob ich auf „Prüfen“ klicke und Produkte zum Verkauf ansehe. Wir haben das gesamte CSS bereit, wenn wir diese Produktelemente in dieses Div genau hier einfügen. Bevor ich irgendetwas mache, lass mich dir einen Überblick darüber geben , was wir hier erstellen wollen. Dies wird unser abgeschlossenes Projekt sein. Wie Sie hier sehen können, haben wir vier Produkte, die wir in unseren Warenkorb legen können Wenn ich unter einem dieser Produkte auf die Schaltfläche In den Einkaufswagen klicke , wird dieser Artikel hier in unseren kleinen Einkaufswagen gelegt. Wenn ich erneut auf diese Schaltfläche klicke, erhöht sich die Menge Wenn ich auf die Schaltfläche „In den Einkaufswagen“ eines anderen Produkts klicke, wird diese Zeile der Tabelle hier hinzugefügt, wodurch die Summe automatisch aktualisiert wird. Denken Sie daran, dass all dies etwa 10 Dollar sind, also ist es ziemlich einfach Mathematik, und ich kann die Menge auch über diese Mengenauswahl aktualisieren, und das wird die Summen gegebenenfalls aktualisieren. Ich kann auch hier reingehen und das auf 10 setzen, wenn ich will. Dann kann ich meine eigene spezifische Menge einstellen. Die Theorie dahinter ist, wenn es ein echter Einkaufswagen wäre, könnte ich auf einen Button klicken und er würde mit dieser Auswahl auschecken. Wenn wir die Seite aktualisieren, verlieren wir für unsere Zwecke unseren Einkaufswagen. Wir könnten etwas Code schreiben, um diesen in den lokalen Speicher oder den Sitzungsspeicher zu behalten . Aber für die Zwecke dieses Videos glaube ich nicht, dass wir das wirklich tun müssen, das könnte eine Verbesserung sein, die Sie in Zukunft vornehmen. Das letzte, was es tut, ist, wenn es eins ist und Sie versuchen, die Menge zu reduzieren, wird dieser Artikel einfach aus dem Warenkorb entfernt. Wenn sich keine Artikel im Einkaufswagen befinden, verschwindet die gesamte Tabelle. Das bauen wir also. Ich lasse den Tab vielleicht zur Seite offen, gehe zurück hierher und lass uns an die Arbeit gehen. Eigentlich noch eine Sache, bevor wir damit anfangen, möchte ich tatsächlich übersehen , wie wir dies in Webkomponenten aufteilen werden. Hier sehen Sie, dass wir jedes dieser Produkte hier haben und die gleiche Funktionalität gibt es für alle. Wenn ich auf die Schaltfläche In den Einkaufswagen klicke, wird dieses bestimmte Produkt in den Warenkorb gelegt, sodass jedes dieser Produkte seine eigene Webkomponente sein wird. Wie Sie sehen können, wenn ich hier aktualisiere, klicke auf „In den Einkaufswagen“. Dieser weitere Abschnitt wird hier hinzugefügt, nämlich unsere Liste der Warenkorbartikel, die Tabelle für Warenkorbartikel. Das wird auch eine Komponente sein. Schließlich haben wir innerhalb dieser Tabellenkomponente für Warenkorbartikel eine weitere Komponente, die hier unser Mengeneingabe-Selektor ist . Jedes Mal, wenn ich auf Plus oder Minus klicke, legen wir hier eine bestimmte Menge fest und setzen sie auf Null. Mal sehen, was passiert, es verschwindet. Das wird auch eine Komponente sein. Beginnen wir mit der Produktkomponente. Gehen wir hierher und gehen dann zu unserem Code-Editor. wir in unserem js-Ordner die Datei für diese Komponente. Ich nenne es product.js. Fangen wir mit dem Boilerplate an. Ich nenne dieses Klassenproduktelement. Natürlich werden wir das HTML-Element erweitern, wie wir es in dieser Klasse gesehen haben. Bevor ich dann irgendeinen Code schreibe, exportiere ich ihn einfach sofort. Da wir ES-Module mit jeder Komponente verwenden in einer eigenen JavaScript-Datei enthalten ist, verwende ich den Exportstandard und schreibe danach einfach den Klassennamen. Drücken Sie „Enter“ und wechseln Sie dann zu meiner Datei index.js Ich setze meinen Import an den Anfang des Dateiprodukteelements und dann direkt vom Pfad zu dieser Datei, die waren bereits im JavaScript-Ordner, also wird es sein.product.js. Dann müssen wir hier eine definierte Methode einsetzen, natürlich definieren benutzerdefinierte Elemente. Ich nenne diese Produktelemente einfach als erstes Argument und bringe dann diese Produktelementklasse ein. Ich muss auch diese Datei index.js in HTML importieren. Vergessen wir das nicht. Script src=“ js/index.js " und dann nicht zu vergessen dieses Typattribut des Moduls. Klicken Sie auf „Speichern“, aktualisieren Sie es hier und prüfen Sie, ob es irgendwelche JavaScript-Fehler gibt, die es nicht gibt. Perfekt. Lass uns zurückgehen. Anstelle dieser vier Divs möchte ich vier Produktelemente machen. Lasst uns auf „Save“ klicken und hier rüber gehen. Wie üblich füge ich die Konstruktormethode hinzu und führe dann super aus. Jetzt müssen wir darüber nachdenken, wie wir unsere benutzerdefinierte Webkomponente hier konstruieren möchten . Wenn ich mir den Code hier ansehe, werden wir diese Webkomponente vier verschiedene Male einbringen . Ich weiß nicht, ob ich meinen inneren HTML-Code in jeden von diesen schreiben möchte , weil es sich ziemlich wiederholen wird. Was ich tun könnte, ist, dass ich die HTML-Struktur hier in die Definition der Webkomponentenklasse einfügen könnte. Auf diese Weise ist es für jede Webkomponente dasselbe , was wir wollen, und das hält unseren Code sauber. Was ich tun werde, ist, dass ich diesen inneren HTML schreibe. Diese Struktur basiert auf dem CSS, das ich bereits eingerichtet habe. Es nutzt Klassen, die bereits im CSS sind. Ich erstelle ein Div mit der Klasse des Image-Containers. Schließen Sie das und dann mache ich das Bild mit einer Klasse von Produktbildern. Dann werde ich das SRC einsetzen , das, sobald wir hier sind, anfangen sollten, bei uns selbst zu denken, das muss ein dynamischer Wert sein. Wenn es sich um einen dynamischen Wert handelt können wir hier nicht wirklich etwas explizit festlegen , denn dann wird das Produktbild für jedes Produkt gleich sein. Offensichtlich wird die Struktur jedes Produktelements gleich sein , aber das Produkt wird sich ändern und damit das Produktbild. Daher werden sich der Titel und die Produkt-ID alle ändern. Jetzt kommen wir zu jedem von denen, wie es kommt. Aber um uns zu beginnen, möchte ich zumindest ein benutzerdefiniertes Attribut für das Image erstellen. Auf diese Weise können wir das Image in jeder dieser Webkomponenten weitergeben . Wir haben dies schon einmal in der Klasse gesehen, als wir uns benutzerdefinierte Attribute angeschaut haben, jetzt können wir es in der Praxis verwenden. Was ich tun werde, ist ein Bildattribut einzufügen und uns hier einen Blick in unseren Ordner zu werfen. Wir machen das zum Pfad zum Bild, image/coke-zero.jpg. Kopieren wir das hier und hier und dann aktualisieren wir das. Der zweite wird Hanfsaatöl sein. nächste wird magische Berührungs-Körper-Creme und dann wird die letzte Rot-Curry-Paste sein . Drücken Sie dabei auf „Speichern“. Was wir dann tun können, ist hier zu unserer Webkomponente zu gehen . Wir können das Image in den Webkomponenten festlegen. Wir setzen eine Variable, die an diese Webkomponente angehängt ist, wie zuvor, erhalten Attribut und wir erhalten den Wert dieses Bildattributs. Da wir diesen Wert haben , können wir dann hier hineingehen und ihn hier in dieses SRC einfügen. Ich klicke auf „Speichern“, aktualisiere hier drüben und mal sehen, was wir haben. Sie werden sich trösten, keine Fehler. Aber du kannst sehen, dass es auch nicht rüberkommt. Ich vermute, dass dies auf einen albernen Fehler zurückzuführen ist. Ja, es ist ein alberner Tippfehler. Sollte Produktelement sein, keine Produktelemente. Geh einfach durch und werde diese S los. Klicken Sie auf „Speichern“ und wenn wir uns hier aktualisieren, müssen wir nicht einmal aktualisieren, weil Sie sehen können, dass es für uns funktioniert. Mal sehen, ob wir die Dinge noch sehen können. Ja. Lassen Sie uns das unten legen und dann können Sie sehen, dass wir unsere Aufstellung der vier Produktbilder haben. Wir haben die gleiche Struktur für jedes Produktelement, das wir hier speichern, aber wir passieren den dynamischen Wert, wo die Bild-URL befindet, und fügen sie dann in unsere Vorlagenstruktur ein hier. Aber wie ich bereits erwähnt habe, ist die Bild-URL natürlich nicht der einzige dynamische Inhalt, den wir in dieses Produktelement weitergeben müssen . Wir brauchen den Titelschrägstrich den Namen des Produkts. Wir brauchen seinen Preis und wir brauchen seine ID. Lassen Sie uns dafür auch einige Attribute erstellen. Lassen Sie uns mit dem nächsten in der visuellen Hierarchie fortfahren. Lass uns mit dem Namen fortfahren. Ich mache genau das gleiche Format, das ich hier gemacht habe. Erstellen Sie eine Variable namens this.name und rufen Sie dann den Wert des Attributnamens ab. Offensichtlich wurde dies noch nicht erstellt. Ich gehe hier hinein, ich werde das schließen, damit wir das besser sehen können, und dann erstelle ich ein Namensattribut für all diese Produktelemente. Dann wird dieser Cola Null sein. Ich setze Klammern ein, kann. Dann hier Hanfsamenöl und dann nenne ich es einfach Körpercreme und dann hier rote Currypaste. Drücken Sie dabei auf „Speichern“. Gehen wir hier rüber und dann müssen wir diesen Namen tatsächlich irgendwo in unserem Code verwenden. Ich kann hier runter gehen und dann kann ich gehen, wie wir es mit dem Bild gemacht haben, ein h2 in diesem h2 erstellen. Ich kann diesen Namen einschieben. Wenn Sie hier aktualisieren, können Sie jetzt den Namen jedes Produkts unter dem Produktbild sehen . Es gibt hier ein paar CSS-Probleme und das liegt daran, dass es sich nicht im Image-Container befinden sollte . Lass mich das reparieren. Es sollte außerhalb dieses Div sein. Ich habe bei dieser Aktualisierung hier auf „Speichern“ geklickt dann kannst du sehen, dass wir dieses Problem nicht mehr haben. Süß. Das macht unsere visuelle Hierarchie aus. Aber das andere, was wir tun müssen, ist tatsächlich einige Daten in diesem Produktelement zu speichern, wenn wir auf „In den Einkaufswagen“ klicken da wir je nachdem, welche Schaltfläche oder welches Element wir auf „In den Einkaufswagen“ klicken auf wird einen anderen Wert haben. Ich werde das tun, anstatt es dem inneren HTML hinzuzufügen Ich erstelle ein Element und füge es dann an das DOM an. Der Grund, warum ich es so mache , ist, dass ich einen Event-Listener anhängen kann , bevor ich ihn an das DOM anfüge. Was ich mache, ist ein Element für den Button zu erstellen. Es wird nur Button sein und dann muss ich das natürlich irgendwo aufbewahren, also werde ich das einfach in der Konstante namens Button aufbewahren . Ich setze den inneren HTML-Code der Schaltfläche zum Warenkorb und füge dann einen Ereignis-Listener hinzu. Eigentlich kommentieren wir das vorerst. Geh in einer Sekunde zurück. Ich füge das einfach an , um zuerst ein Dokument hinzuzufügen. Klicken Sie auf „Speichern“, aktualisieren Sie es hier und Sie können sehen, dass wir unsere Schaltflächen in den Einkaufswagen und ihren Stil haben, genau wie in unserem Beispiel aufgrund des CSS, das wir bereits dort haben. Damit dies funktioniert, müssen wir wissen können, wie der Name und die ID des Produkts sind, das wir dem Warenkorb hinzufügen? Weil dies derzeit nichts tut, und dort werden wir die ID weitergeben aber wir müssen auch wissen, wie hoch der Preis für jedes Produkt ist, der Preis für jedes Produkt ist, damit wir es auch zu unserer Warenkorb-Tabelle hinzufügen können. Wir geben ID und Preis ein. Lassen Sie uns auch Attribute für sie erstellen. Ich beginne in der Komponente, und ich sage, dass dies.id entspricht dies.getAttribute, nicht Animationsattribute, ID und dann this.price, this.getAttribute Preis. Dann gehe ich zu den Elementen hier. Fügen wir für jeden eine ID hinzu. Die erste, die wir 1, 2, 3 und 4 machen werden. Es gibt nur vollständige Produkte, daher brauchen wir nur einfache IDs. Dann füge ich den Preis hinzu. Wir werden es einfach halten und jedem von ihnen 10 Dollar verdienen. Wir geben diese jetzt einfach als Ziffern weiter und wandeln sie später in ganze Zahlen oder Floats um. jetzt zu unserer Webkomponente zurückkehren, ist dies der Teil, in dem wir tatsächlich einige Funktionen einbauen und etwas komplizierter werden. Wie Sie hier sehen können, habe ich einen auskommentierten EventListener. Was ich tun möchte, bevor wir das ausbauen, ist die Methode zu erstellen , die dieser EventListener auslösen wird. außerhalb des Konstruktors Lassen Sie uns außerhalb des Konstruktors unsere eigene Methode namens AddToCart erstellen. In AddToCart erstellen wir ein Objekt mit allen Attributen , die wir einem Warenkorbgegenstand hinzufügen möchten . Ich erstelle ein const item Objekt und du solltest in Kürze sehen, was ich damit meine. Ich füge natürlich einen Schlüssel der ID hinzu und nehme einfach die ID, und nehme einfach die in dieser Webkomponente gespeichert ist. Ich schließe das, damit du mehr siehst. Dann nehme ich den Namen und der entspricht dem Namen, wie er in der Webkomponente festgelegt ist . Menge ist immer gleich eins, da die Schaltfläche In den Einkaufswagen standardmäßig nur eine hinzufügt. Sie können später eine Mengenauswahl zu diesem Element hinzufügen , wenn Sie als Verbesserung möchten. Aber jetzt wird jedes Mal, wenn Sie auf „In den Einkaufswagen“ klicken , nur einen hinzufügen. Ich repariere das auf die Nummer 1, und dann wird der Preis dies.price sein. Werfen wir einen Blick darauf. Wenn wir das tatsächlich ausführen, werde ich nur damit anfangen, nur um zu sehen, dass das Konsolenprotokoll ausgeführt wird, und dann IteMobject, das Objekt, das wir gerade erstellt haben. Hier oben in addEventListener werde ich offensichtlich nach dem Klick „Event“ suchen, und dann führe ich diese AddToCart-Methode aus, und dann binde ich das, so dass wenn ich hier unten bin -Methode , wenn ich darauf verweise, werde ich auf die Webkomponente verweisen , nicht auf das Ereignis. Klicken Sie auf „Speichern“ und aktualisieren Sie hier drüben. Öffnen wir unsere Konsole und wenn ich im Hanfsamenöl auf „In den Einkaufswagen“ klicke, können Sie sehen, dass es die Daten durchsendet. Wir können sehen, dass die Produkt-ID 2 ist, der Name ist Hanfsamenöl. Wir fügen eins hinzu und der Preis von jedem beträgt 10. Wenn ich es auf der Coke Zero Can mache, bekomme ich ein bisschen verschiedene Daten. Wenn ich es auf der Body Cream und Red Curry Paste mache, kannst du sehen, dass ich jedes Mal ein anderes Gegenstandsobjekt bekomme. Das bestätigt, dass wir ein Objekt mit allen Informationen senden , die wir benötigen. Was wir jetzt tun müssen, ist ein bisschen Logik zu schreiben , um es diesem Artikelarray innerhalb unseres Warenkorbobjekts hinzuzufügen . Gehen wir hier rüber und ich zeige Ihnen, wie wir auf dieses Warenkorbobjekt zugreifen können. Da es sich um das Window-Objekt handelt, können wir window.cart eingeben, um es uns anzusehen, oder wir können einfach einen Einkaufswagen schreiben weil wir uns bereits im Kontext von window befinden. Wie Sie sehen können, können wir sehen, dass wir ein Objekt mit einem leeren Element-Array haben . Was wir sehen möchten, wenn wir das erneut ausgeben, nachdem wir in den Warenkorb gelegt haben, ist, dass wir einen neuen Artikel in diesem Artikelarray haben. Das kläre ich. Lass uns das jetzt machen. Ich werde dieses Konsolenprotokoll kommentieren, und was wir in den meisten Fällen tun müssen, ist , dieses Objekt einfach zum Array dieses Elements hinzuzufügen . Wir werden window.cart.items.push ausführen , um dieses Elementobjekt dem Element-Array hinzuzufügen, und dann werden wir das Item-Objekt als Argument dort einfügen . Lasst uns dabei auf „Speichern“ klicken. Aktualisieren Sie hier drüben. Wenn ich jetzt den Warenkorb eintippe, kannst du sehen, dass wir ein Items Array haben, das leer ist. Lassen Sie uns etwas spezifischer werden und konkret Warenkorbartikel sagen. Wir haben ein leeres Array , das klar zu sehen ist. Lass mich das einfach noch einmal machen. Wir haben das Vorher, wenn ich dann auf „In den Einkaufswagen“ klicke und jetzt cart.items eintippe, wirst du sehen, dass wir ein Objekt in unserem Array haben, und wenn ich hineinschaue, ist es unser Hanfsamenöl mit dem Menge von eins. Wenn ich auf Body Cream auf „In den Einkaufswagen“ klicke und dann cart.items gehe, solltest du jetzt sehen, dass wir zwei Artikel in unserem Array mit jedem dieser Produkte haben . Jetzt haben wir ein Problem , von dem ich nicht weiß, ob Sie daran gedacht haben oder nicht, aber Sie werden bald herausfinden , dass dies ein Problem ist. Wenn ich ein weiteres Produkt hinzufüge , das wir bereits in unserem Warenkorb haben, sagen wir noch einmal Hanfsamenöl, und dann gehe ich hin und gehe zum Warenkorb. Artikel, Sie werden sehen, dass wir drei Artikel im Warenkorb haben, und wir haben zweimal Hanfsamenöl, aber mit je einer Menge. Wir möchten einen Artikel im Array für Hanfsamenöl sehen, aber wir möchten, dass diese Zahl zwei ist. Dafür müssen wir ein bisschen zusätzliche Logik schreiben. Gehen wir zurück zu hier und verwenden wir die find-Methode in JavaScript, um herauszufinden ob das Element bereits im Array vorhanden ist. Ich erstelle einen konstanten Artikel im Warenkorb. Dann werden wir nach window.cart.items suchen , dann verwenden wir die Methode find, die das Element durchläuft. Wenn die Item-ID der Item-Objekt-ID entspricht , haben wir eine Übereinstimmung gefunden, und das wird das Objekt sein. Bevor Sie etwas anderes schreiben, machen wir einfach console.log item_in_cart. Es sollte entweder als undefiniert oder als ein anderer Nullwert vorkommen , wenn es tatsächlich etwas finden kann, aber wenn es etwas findet, erhalten wir tatsächlich das Objekt selbst. Erfrischend hier drüben. Klicken wir auf „In den Einkaufswagen“ und es wird als undefiniert angezeigt. Wenn wir jedoch erneut auf „In den Einkaufswagen“ klicken, werden Sie sehen, dass wir das vorhandene Produkt bereits im Warenkorb haben . Wenn go cart.items, sehen Sie, dass wir den gleichen Artikel zweimal im Warenkorb haben. Wir müssen das beheben. Was wir tun werden, ist wenn item_in_cart, dann wollen wir nur den Artikel nehmen, der sich bereits im Warenkorb befindet, und seine Menge einfach um eins erhöhen. Aber wenn es nicht im Warenkorb ist, also wenn es zum Beispiel undefiniert ist, werden wir diesen Code hier unten ausführen, werden wir diesen Code hier unten ausführen um diesen Artikel in den Warenkorb zu schieben. Speichern wir das und schauen wir mal, ob das unser Problem hier behebt. Ich füge Hanfsamenöl hinzu, ich füge Körpercreme hinzu. Werfen wir jetzt einen Blick auf unsere Warenkorbartikel. Wir haben ein Hanfsamenöl und eine Körpercreme. Wenn ich noch einmal eines der gleichen Produkte hinzufüge, das Hanfsamenöl und dann schauen wir uns cart.items an, können Sie sehen, dass wir jetzt nur zwei Artikel in unserem Array haben, und wenn ich darauf klicke, Sie Sie können sehen, indem Sie auf dem Hanfsamenöl auf „In den Einkaufswagen“ klicken, hat es keinen neuen Artikel in unserem Array erstellt , aber es wird einfach die Menge dieses vorhandenen Artikels erhöht , was genau das ist, was wir wollen. hierher zurückkehren, sind das im Wesentlichen alle Funktionen, die wir benötigen, insbesondere aus dem Produktelement. Um es an dieser Stelle zusammenzufassen, bevor wir fortfahren, haben wir eine Webkomponente für Produktelemente erstellt. Wir haben vier Parameter überschritten. Innerhalb der Webkomponente selbst haben wir eine Standardstruktur, die allen Webkomponenten des Produktelements gemeinsam ist , und eine gemeinsame Funktionalität von AddToCart, die wir hier sehen können. Ich werde dieses Konsolenprotokoll entfernen, weil das alles funktioniert , und jetzt können Sie sehen, obwohl wir cart.items noch nicht visuell auf der Seite dargestellt haben , können wir Artikel zu unserem hinzufügen Array für Einkaufswagen Artikel. Das Warenkorbobjekt hier ist im Grunde unser Zustandsobjekt, und wir werden dieses Warenkorbobjekt verwenden , um unsere Warenkorb-Tabelle im nächsten Video zu erstellen. Wie versprochen, werde ich diesen Code festschreiben und verwerfen. Ich hätte das wahrscheinlich in „Get Ignorieren“ setzen sollen. Unstage, geh hier rein, verwerfe das, und dann verbinde ich unsere Änderungen an index.html, index.js und dann natürlich die Erstellung von product.js. Ich werde all diese Änderungen inszenieren und die Commit-Nachricht hinzufügen Produkt-Element-Webkomponente erstellen. Fegen. Ich drücke erneut auf Commit und verwerfe diese Änderungen. Ich werde das in ein anderes Video aufteilen. Im nächsten Video sehen wir uns die Komponente „Warenkorbartikel“ an. 11. Web-Komponenten in der Praxis Teil 2: Alles klar, Leute. Im letzten Video haben wir eine index.js eingerichtet, die unsere geschnittenen Objekte mit dem Element-Array enthält, und wir haben gelernt, wie wir dieses Artikelarray über dieses Produktelement füllen können über dieses Produktelement , das wir im vorherigen Video erstellt haben. und offensichtlich hat das auch eine visuelle Komponente . Wir haben jedes dieser Produktelemente mit diesen Buttons zum Einkaufswagen. Wenn ich auf eine dieser Buttons zum Einkaufswagen klicke, wird unsere cart.items aktualisiert, die wir hier haben, aber das ist noch nicht visuell auf dem Bildschirm dargestellt. Das machen wir in diesem Video. Wir erstellen eine neue Komponente namens Warenkorbartikel. Lasst uns das jetzt machen. Gehen wir in unseren JS-Ordner erstellen Sie eine neue Datei namens cart-items.js. Lassen Sie uns unseren Komponenten-Boilerplate-Code hier in Gang bringen. Warenkorbartikel nennen ich es, und wir werden die HTML-Elementklasse erweitern. Da sind wir los. Ich bin hier versucht, nur benutzerdefinierte Elemente zu schreiben, aber denken Sie daran, dass wir ES-Module verwenden. Stattdessen exportiere ich Warenkorbartikel, und dann mache ich meine definierte Methode hier in der Indexdatei. Definieren Sie hier Warenkorbartikel, Warenkorbartikel. Siehe da, Visual Studio-Code weiß, was ich importieren möchte , und fügt hier automatisch die Eingabeanweisung hinzu. Aber wenn Ihr Code-Editor das aus irgendeinem Grund nicht tut , können Sie diesen Code einfach schreiben. Es ist das gleiche Format wie das, was wir zuvor hatten. Süß. Um diese Warenkorbkomponente auf ein Dokument zu bringen, gehe ich einfach hierher in unseren Container, also ist alles enthalten Ich füge unsere benutzerdefinierte Webkomponente der Warenkorbartikel hinzu. Es wird dort automatisch das schließende Tag eingefügt. Wenn ich jetzt meine Seite hier aktualisiere und es keine Fehler gibt, kann ich zuverlässig feststellen, dass wir das hier in unserem Dokument haben. Wenn ich hier reingehe, siehst du, dass wir unsere Webkomponente für leere Warenkorbartikel hier haben. Lasst uns tatsächlich ein paar Sachen hinzufügen. Lassen Sie uns vorerst Produkte schließen. Gehen wir hier zu unserer Klassendefinition. Offensichtlich werden wir wie immer unseren Konstruktor brauchen, und in unserem Konstruktor werden wir unsere Super-Methode einsetzen. Im Gegensatz zu allen anderen Komponenten, die wir in der Vergangenheit hergestellt haben, werde ich sie jetzt anderen Komponenten, die wir in der Vergangenheit hergestellt haben, für die Konstruktormethode dort belassen . Ich werde unser gesamtes Rendern in eine andere Funktion namens Render einfügen . Warum sollte ich das machen? Der Grund dafür ist, dass wir, wenn wir ein neues Produkt über dieses Produktelement in den Warenkorb legen, zum ersten Mal rendern oder unsere Warenkorb-Tabelle erneut rendern müssen . Es wird praktisch sein, unsere Renderfunktion hier zu haben , damit wir jederzeit wieder rendern können. Der gesamte Code in dieser Renderfunktion wird nicht ausgeführt, wenn die Komponente „Warenkorbartikel “ auf der Seite enthalten ist, wie wir es hier haben, wird tatsächlich ausgeführt , sobald wir sie ausdrücklich zum Rendern aufgefordert haben. Das wird eine Menge Code sein und ich werde nicht sehr ausführlich auf alles eingehen, aber ich werde es erklären, während ich gehe. Was ich mache, ist einen Ausgangspunkt für diese Warenkorbkomponente zu erstellen . Ich setze den inneren HTML-Code auf nichts, wenn wir rendern ausführen. Nun, die Absicht ist wenn wir Render in Zukunft ausführen, müssen wir den Inhalt löschen, den wir zuvor hatten, sonst könnten wir einen Teil des alten inneren HTML in unserer Komponente haben des alten inneren HTML in , wenn wir muss den Einkaufswagen erneut rendern. Was ich dann tun werde, ist ein HTML mit Document create zu erstellen, die zweite Methode, die wir im früheren Video auf drei Möglichkeiten gesehen haben , HTML in unserer Webkomponente zu erstellen. Ich habe vergessen, den Namen der Variablen hier einzugeben. Ich nenne diesen Ein-Tabellen-Container. Dann füge ich die Klasse des Tabellencontainers zu diesem Tabellencontainer div hinzu, und dann heißt das zweite Element, das ich erstellen werde , Tabelle. Dies ist unsere tatsächliche Warenkorb-Tabelle. Um ein Tabellenelement zu erstellen, weisen Sie es hier der Tabellenkonstante zu. Was wir dann tun werden , ist, dass wir alle Artikel des Einkaufswagens durchlaufen. Ich werde jeweils eine Vier dafür laufen. Ich werde hier zwei Argumente haben, eines für das Element selbst, damit es das Element selbst ist, und dann wird das zweite der Index sein. Lassen Sie mich einfach in einer Sekunde darauf zurückkommen bevor ich in diesen tiefen Code gehe. Was ich machen werde, ist table_container. Was ich tun möchte, ist, unsere Tabelle an diesen Tabellencontainer anzuhängen , und dann hängen wir den Tabellencontainer an unsere Webkomponente an. Hier ist ein bisschen los, aber ertrag mit mir. Was wir tun, ist, dass wir im Grunde erstellt haben, wenn ich hier speichere und dann aktualisiere. Jetzt wird es nicht wirklich gerendert, weil, denken Sie daran, dass dies in der Render-Methode enthalten ist, es ist nicht wie zuvor auf dem Konstruktor. Was wir tun müssen, ist etwas Code auszuführen, um die Webkomponente zu finden , nach der wir suchen, nämlich Cart-Items, und dann die Render-Methode darauf auszuführen. Wenn ich jetzt wieder hierher gehe, kannst du sehen, dass wir in unseren Einkaufswagen ein div mit der Klasse des Tischbehälters haben werden und im Inneren werden wir den Tisch haben. Das machen wir hier, wir erstellen diese HTML-Struktur. Was wir jetzt tun werden, ist für jedes Element im Array, wir hinzufügen werden. Ich werde den inneren HTML-Code abrufen, und ich werde das Plus gleich verwenden um hier an unsere Zeichenfolge anzuhängen, lasst uns das öffnen und ich füge hintereinander für jeden Einkaufswagen in unserem cart.items Array. Lasst uns das in Aktion sehen. Wenn ich auf „Speichern“ klicke und hier rübergehe, und lass uns diese Rendermethode erneut ausführen, gehe hier zurück, finde unseren Warenkorb Artikel Tabellencontainer und in unserer Tabelle wirst du sehen, dass es noch keine Zeilen in der Tabelle gibt aber das liegt daran, dass wir tatsächlich nichts in unserem cart.items Array haben . Wenn ich cart.items gehe, ist da nichts drin. Wenn ich, sagen wir mal, zwei Elemente zu unserem Array hinzufügen würde, schauen wir uns jetzt an, cart.items. Wir haben jetzt definitiv zwei Artikel in unserem Array. Wenn ich Render für Warenkorbartikel ausführen sollte, gehen Sie zurück in Elemente, gehen Sie in unsere Tabelle, Sie können sehen, dass wir zwei Zeilen haben. Jetzt müssen wir natürlich jede dieser Zeilen mit den Daten für jeden dieser Warenkorbartikel füllen , und das werden wir gerade tun. Auch hier wird es ziemlich viel Code geben , aber ertragen Sie mich. Wir brauchen drei Tabellenzellen. In der ersten Tabellenzelle geben wir den Elementnamen ein. Natürlich haben wir Zugriff auf jedes Element, während wir ihn durchlaufen, denn das haben wir hier festgelegt. Ich sage den Artikelnamen. Dann haben wir hier eine Mengeneingabe. Darauf kommen wir ein bisschen später hin. In diesem Fall haben wir $sign und dann haben wir unseren Artikelpunktpreis. Wir werden das in einer Sekunde beheben da dies der Linienpreis sein muss. Wenn die Menge also größer als eins ist, müssen wir dies aktualisieren. Was ich dann mache, ist nur ein bisschen Formatierung . Der erste TD. Ich möchte, dass der Text links ausgerichtet ist, aber das ist Standard, also werde ich dort nichts ändern. In der zweiten werde ich den Text an der Mitte ausrichten. Dann das letzte Mal, den ich den Text ausrichten werde , auf rechts. Wenn ich jetzt auf „Speichern“ klicke, denke ich, dass es sowieso automatisch neu geladen wird. Ich habe auf zwei dieser Buttons auf „In den Einkaufswagen“ geklickt. Dann führe ich die Renderfunktion aus. Sie können hier sehen, dass wir die Anfänge unserer Tabelle haben. Wir haben den Namen des Produkts , das in der Kürzung steht, und den Preis. Aber wenn ich diesen noch einmal treffe, haben wir natürlich nur zwei Elemente im Array. Es aktualisiert weder die Menge noch den Linienpreis. Bevor wir also die hier ausgewählte Menge erstellen, kann ich einfach die Artikelmenge eingeben. Während wir hier sind, lassen Sie uns diesen Preis, den Linienkurs, festlegen . Nennen wir einfach diesen Zeilenkurs. Das wird gleich sein, um sicherzustellen, dass wir dies in die Schleife stecken. Der Positionspreis entspricht dem Artikelpunktpreis mal nach Artikelmenge. klicke ich auf „Speichern“. Aktualisieren Sie hier drüben, fügen wir einige Artikel in den Warenkorb. Ich habe gerade „In den Einkaufswagen“ auf Hanfsamenöl, dann auf Körpercreme und dann wieder auf Hanfsamenöl gedrückt dann auf Körpercreme , also sollten wir zwei Artikel in unserem Array sehen. Wenn ich hier runter gehe, siehst du, dass unsere Auswahl gespeichert wurde. Wenn wir render ausführen, können wir sehen, dass es in unserer Tabelle hier unten angezeigt wird. Jedes Mal, wenn wir die Renderfunktion selbst ausführen müssen , wollen wir das natürlich nicht tun. Wir erwarten nicht, dass der Benutzer in seine Konsole geht und weiß, welchen Befehl ausgeführt werden soll. Lassen Sie uns das also so einrichten, dass es in unserem Produkt dot js läuft. Nachdem wir in den Warenkorb gelegt haben, füge ich hier eine Zeile hinzu. Wir können diese Linie buchstäblich einfach nehmen und dort platzieren. Klicken Sie auf „Speichern“, aktualisieren Sie hier drüben. Jedes Mal, wenn wir auf „In den Einkaufswagen“ klicken, wird der Warenkorb erneut gerendert. Das nervt mich ein bisschen. Ich möchte diese Webkomponente in ihren eigenen Variablen speichern , also erstelle ich dafür eine Variable. Ich gehe hier hoch und mache diesen Punktwagen-Artikel gleich und nehme dann das Element des DOM. Das fühle ich mich, dass es nur ein bisschen sauberer ist. Nochmal, ich muss es nicht so machen, aber ich mag es ein bisschen besser. Der nächste Teil, den ich machen werde, bevor ich Kodierung der Mengeneingabe fortfahre , besteht darin, die Tabellenfußzeile zu erstellen. Wenn ich es mir jetzt ansehe, haben wir eigentlich nicht die Summe und dafür erstellen wir eine Tischfußzeile. Ich entferne das einfach dort. Lass uns in den Warenkorb gehen Artikel dot js. Wir sind schon da. Nach diesem Code werde ich dann ein neues Element namens Footer Document erstellt Element erstellen . Das wird ein Div sein. Dann muss ich auch die Gesamtsumme des Einkaufswagens herausfinden. Also muss ich hier eine kleine komplizierte Methode verwenden , Punkt-Cart-Punkt-Artikel, und dann die Reduce-Methode ausführen um alles zu erreichen. Wenn das Sie verwirrt, studieren Sie einfach die reduzierte Methode, aber es ist eine Möglichkeit für uns, alle Werte zu addieren, um eine Summe zu erstellen. Was ich tun werde, ist die Preise als Strings durchlaufen werden, weil wir sie hier als String in unserem HTML-Code durchgemacht haben, wir müssen sie nur in ganze Zahlen übergeben. Nun möchten wir diese vielleicht in Floats übergeben, wenn wir Dezimalwerte hätten , aber für dieses Projekt werden wir keine Dezimalwerte haben. Der niedrigste Betrag wird eins sein und er wird in einem steigen, also wird nichts 2,75 Dollar oder ähnliches betragen. Wir werden es einfach halten. Es wird 10 Dollar oder 20 Dollar betragen. Eigentlich wird alles in diesem Projekt 10 US-Dollar betragen , also halten wir es sehr einfach. Aber nur damit du es weißt, musst du das vielleicht ändern. Aber für unsere Zwecke wird alles eine ganze Zahl sein, also können wir Pars int machen. Lass mich das ein bisschen mehr für dich aufmachen. Dann werden wir in den Pars int den Gesamtpreis des Add-Artikelpunkts um die Artikelpunktmenge nehmen den Gesamtpreis des Add-Artikelpunkts , was natürlich der Zeilenpreis ist, den wir hier oben bereits berechnet haben. Im zweiten Parameter werden wir Null durchmachen. Was wir also tun können, ist den inneren HTML-Code der Fußzeile auf zu setzen, lassen Sie uns hier etwas HTML-Code eingeben. Lassen Sie uns einen anderen Tisch einlegen , der mit der ersten Tabelle übereinstimmt. Ich gebe diesem eine Klasse der Warenkorb-Fußzeile. Dann werden wir eine neue Reihe einreihen. Dann legen wir hier eine Zelle ein, die nur das Wort Gesamt haben wird. Dann legen wir eine andere Zelle für die Summe selbst ein. Ich werde den Textstil einsetzen, ausrichten. Es stimmt mit dem Linienkurs hier überein. Dann können wir hier unseren dynamischen Wert setzen. Also lege ich zuerst ein tatsächliches $ -Zeichen und dann signiere $ geschweifte Klammern, um sie in unseren Warenkorb zu legen, was wir gerade berechnet haben. Dann hier unten hängt dieser Punkt die untergeordnete Fußzeile an. Ich klicke auf „Speichern“ und dann aktualisieren wir uns hier drüben. Wenn ich auf „In den Einkaufswagen“ klicke, siehst du, dass unsere Gesamtsumme hier angezeigt wird. Ich kann die Mengen noch nicht reduzieren, aber Sie können sehen, dass wir zumindest Artikel in den Warenkorb legen können. Unsere Warenkorb-Tabelle wird aktualisiert, komplett mit der Summe, so dass wir gerade für die Warenkorbartikel, Tabellenkomponenten hier abdeckt . Die letzte Komponente wird die Mengeneingabekomponente sein , die innerhalb der Curt Items Komponente verschachtelt wird . Ich breche das in ein eigenes Video auf, also werden wir das im nächsten Video behandeln. Dann nehmen wir unsere letzten Änderungen , um dieses Projekt abzuschließen. Ich werde euch beim nächsten erwischen. 12. Web-Komponenten in der Praxis Teil 3: In diesem dritten und hoffentlich letzten Video dieser Serie, in dem wir diese benutzerdefinierte Warenkorb-Funktionalität erstellen, codiere ich die Mengeneingabe. Eine Sache, die ich vergessen habe, bevor wir das letzte Video geschlossen haben , war, diesen Code für euch zu verpflichten, also mache ich das jetzt. Ich verwerfe diesen DS Store einfach wieder und schaue mir hier nur die Änderungen an. Ich mache das immer gerne, bevor ich mich verpflichte. Ich werde all diese inszenieren und die Commit-Nachricht wird ausgeschnittene Elemente erstellen. Das ist engagiert. Wirf das nochmal weg. Lassen Sie mich einige davon schließen. Ich werde sie wahrscheinlich wieder öffnen müssen, aber hier ist zu viel los. Gehen wir hier in unseren js-Ordner und erstellen die Mengeneingabekomponente. Auch hier, beginnend mit dem Boilerplate-Code, solltet ihr damit inzwischen ziemlich vertraut sein. Mengeneingabe erweitert HTML-Elemente. Dann exportieren wir es sofort. Exportieren Sie Standard, Mengeneingabe und gehen Sie dann in index.js. Ich schreibe zuerst meine benutzerdefinierte Elemente-Methode , weil ich weiß, dass sie sie automatisch importieren wird. Nennen wir das mit dem erweiterten Namen Quantity-Input. Magic VS Code hat diese Eingabeanweisung für uns hineingelegt diese Eingabeanweisung für uns hineingelegt , damit ich das schließen kann. Für dieses spezielle Element werde ich im Grunde alles im Konstruktor konstruieren, wie wir es zuvor in dieser Klasse gesehen haben. Es wird hier ziemlich viel Code geben und wenn Sie sich fragen, wo ich alle Ideen dafür habe, habe ich das Dawn-Thema von Shopify tatsächlich als Inspiration genommen . Ein Großteil dieses Codes ist von demselben Code innerhalb dieser Komponente innerhalb des Shopify-Dawn-Themas inspiriert demselben Code innerhalb dieser Komponente innerhalb . Wenn Sie dies dagegen referenzieren oder sich fragen möchten, woher mein Denkprozess es kommt, können Sie sich dieses Thema ansehen. Wie üblich werden wir hier die Super-Methode einsetzen und dann werde ich den gesamten HTML-Code in der cart-items.js schreiben . hier oben scrollen, schreiben wir bisher nur die Artikelmenge so, wie sie in dieser zweiten Spalte steht, aber natürlich können wir sie nicht aktualisieren, da dort keine Eingabe vorhanden ist. Ersetzen wir dies durch unser neues benutzerdefiniertes Element, Mengeneingabe für das schließende Tag. Ich werde den gesamten inneren HTML-Code innerhalb der Tags selbst erstellen . Wir haben das offensichtlich nicht für das Produktelement hier gemacht, weil wir es nicht vier verschiedene Male ausschreiben mussten. Im Falle der Mengeneingabe schreiben wir es jedes Mal aus, schreiben wir es jedes Mal aus wenn eine Zeile in der Tabelle vorhanden ist, und jede Zeile wird praktisch gleich aussehen. Der einzige Unterschied sind die Daten, die in dem Artikel durchkommen. Wir können es hier platzieren und es wird immer noch DRY-Code sein. Hier lege ich nur eine Quantitätsklasse ein. Wenn du siehst, dass ich solche Klassen schreibe, hängt es mit dem CSS zusammen, also mach dir keine Sorgen um die Klassen. Dann erstellen wir unsere beiden Buttons, unseren Minus-Button, unsere Eingabe selbst. Offensichtlich gibt es noch viel mehr Sachen , die hier reingehen müssen, aber ich fange einfach zuerst mit der Grundstruktur an. Wir haben einen Eingabetaste. Werfen wir einen Blick darauf, wie das aussieht. Sie können dort die grundlegende Struktur sehen, aber natürlich müssen wir das Minus zwischen diesen Button-Tags und dann das Plus zwischen diesen Button-Tags einfügen zwischen diesen Button-Tags und . Für die Attribute geben wir ihm eine Klasse, wir werden sie hier auf beide Schaltflächen setzen, Klasse der Quantity__button. Ich werde das schließen , damit wir besser sehen können. Geben Sie die Schaltfläche ein. Wir können das auf beide setzen, geben Sie die Schaltfläche ein, und dann wird der Name darauf basieren, wo es Minus oder Plus ist. Ich entkomme da raus und dann setze ich Minus in den ersten und dann plus in den zweiten. Lasst uns auf „Speichern“ klicken und sehen , wie das bisher aussieht. Es sieht so aus, als hätten wir einen Treffer „Speichern“ dabei. relevant sollte es sowieso nicht sein. Klicken Sie auf „In den Einkaufswagen“ und wie Sie jetzt sehen können, haben wir unsere Styles für die Plus- und Minuspunkte. Wir müssen hier in unseren Eingabe-Tags hier etwas Code hinzufügen. Fügen wir ein paar Attribute hinzu. Wir möchten, dass der Typ Zahlen ist, damit die Leute den Warenkorb verwenden, der hier einen anderen Text als Ziffern einfügt. Der Wert wird gleich dem item.quantity sein. Das Minimum wird Null sein. Wir wollen keine negativen Werte. Wir geben ihm eine ID und die ID beginnt mit der Menge und dann werden wir einen Bindestrich setzen und dann den Index verwenden , um jede der Eingaben zu unterscheiden. Dann lege ich auch hier einen Datenindex ein, der das Gleiche sein wird. Wir werden das I als Datenindex verwenden. klicke ich auf „Speichern“. Aktualisieren Sie hier drüben, klicken Sie auf „In den Einkaufswagen“ und wie Sie sehen können, sieht das so aus, als würde es funktionieren. Das einzige, was nicht funktioniert, ist, dass wir nicht addieren und subtrahieren können. Wenn ich das auf zwei ändere, wird es die beiden nicht ändern. Wenn ich das auf Null ändere, ändert es nicht wirklich die Null. Dort müssen wir anfangen, unsere Mengeneingabe hier innerhalb ihrer Klassendefinition zu codieren . Lassen Sie uns ein paar Dinge in unserem Konstruktor einrichten. Ich möchte die Eingabe zuerst in eine eigene Variable bringen. Das werden wir innerhalb des DOM innerhalb unserer Webkomponente finden . Dann werde ich einen onButtonClick erstellen, der der Rückruf für unseren EventListener sein wird. Ich füge das Ereignis als einzigen Parameter hinzu. Ich werde jedes Standardverhalten verhindern, und dann schreibe ich hier etwas Logik , damit das funktioniert. Das erste, was ich tun möchte, ist, den vorherigen Wert zu erfassen, den Wert, bevor wir ihn ändern, und das wird zum Zeitpunkt dieses Laufens einfach dem Eingabewert entsprechen . This.Input repräsentiert das Eingabeelement selbst, und wir können natürlich den Wert jeder Eingabe erfassen , indem wir uns einfach die Punktwerteigenschaft ansehen. Es wird den Wert gewinnen, bevor wir ihn ändern, und dann werden wir uns das Event ansehen und uns die Ereignisziele ansehen. Das Ereignisziel in dieser Instanz wird die Schaltfläche sein, auf die wir klicken. Dann schauen wir uns den Namen des Ereignisziels an, dh die Schaltfläche, und wenn es Plus ist, verwenden wir hier nur einen ternären Operator, um den Schritt für die Eingabe zu erhöhen. Step-Up ist nur eine Methode, die es uns ermöglicht , den Wert dieser Eingabe um eins zu erhöhen. Wenn es nicht Plus ist, was bedeutet, dass es definitiv minus ist, weil es nur zwei Optionen gibt, werden wir stattdessen Schritt nach unten laufen. Wenn ich jetzt auf „Speichern“ klicke, jetzt wo wir unseren Event-Handler hier haben, hängen wir das tatsächlich an alle Schaltflächen an. Da es mehrere Schaltflächen gibt, verwenden wir für jeden Button einen QuerySelectorAll, der sich auf beiden und am Ende befindet, aber wir müssen dennoch querySelectorAll verwenden. Das wird uns ein Array geben und dann müssen wir sie durchlaufen. Für jede Schaltfläche fügen wir einen EventListener von click hinzu. Wenn auf die Schaltfläche geklickt wird, führen wir diesen Ereignishandler beim Button-Klick aus. Genau wie zuvor werden wir dies so binden , dass dies die Webkomponente und nicht das Ereignis darstellt. Entferne das Semikolon dort und lege es dort hin. Wenn ich auf „Jetzt speichern“ klicke und hier aktualisiere, klicke auf „In den Einkaufswagen“, kann ich das auf - und absteigen lassen, aber was passiert nicht? Eigentlich, wenn ich Minus drücke, geht es unter. Das ist nicht sehr hilfreich, oder? Ich denke, das hängt wahrscheinlich mit diesem Tippfehler zusammen. Dies ist kein Vergleich, dies ist eine Aufgabe, also lassen Sie mich das zu einer ordnungsgemäßen Aufgabe machen. Gehen wir zurück klicken Sie auf „In den Einkaufswagen“. Wenn ich jetzt nach unten drücke, sollte es funktionieren. Jetzt geht es darum, der Wert innerhalb dieser dass der Wert innerhalb dieser Eingabe mit diesen Tastendrücken auf und ab steigt, was gut ist, aber der Wert in unseren Daten nicht wirklich verändert -Struktur. Sagen wir einfach, ich habe das auf sieben gesetzt, und dann lasst uns tatsächlich zu unserem Array für Einkaufswagen gehen und einen Blick hinein werfen, Sie können sehen, dass die Menge immer noch eins ist. Wir können die Menge erhöhen, indem hier auf „In den Einkaufswagen“ drücken und wie Sie sehen können, wird sie jetzt auf zwei aktualisiert. Wenn ich dann in den Einkaufswagen gehe, kann ich hierher gehen und es ist Menge 2, aber das Auf- und Ablegen ändert eigentlich nichts. Lasst uns das sofort reparieren. Die Art und Weise, wie ich das beheben werde, ist die Verwendung eines benutzerdefinierten Ereignisses. Warum verwende ich hier ein benutzerdefiniertes Ereignis? Nun, ich möchte ein Änderungsereignis für die Menge auslösen. Was ich tun werde, ist, dass ich die Zeile des Artikels, den ich ändern möchte, und seine neue Menge auf eine Methode weitergeben die Zeile des Artikels, den ich werde, und dann wird diese Methode cart.items aktualisieren. Jetzt können wir diese Methode in die Mengeneingabe einfügen, aber ich denke, es ist sinnvoller, sie in Cart-Items zu legen weil es wörtlich cart.items aktualisiert, das Objekt, auf das sich diese Komponente bezieht. Ich lege es vor dem Rendern hier rein. Was diese Methode tun wird, nenne ich sie Update-Quantität. Es wird einen Index benötigen, der sich hier auf den Einzelposten bezieht. Wie Sie hier sehen können, fahren wir durch ein Array und wir speichern auf der Menge wählen Sie aus, um welche Nummer im Array es sich handelt. Ich kann damit die Zeilennummer herausfinden. Dann wird der zweite Parameter der neue Wert sein , den ich nur value als Parameter aufrufe. Wenn dies dann mit diesen beiden Parametern ausgeführt wird, werde ich dann das Element über seinen Index nachschlagen das Element über seinen Index nachschlagen und dann einfach die Menge dieses Artikels nehmen und dann ändern welchen Wert wir auch durchlaufen. Wenn das aktualisiert wird, werden wir dann die Tabelle für Warenkorbartikel erneut rendern, da wir den Linienpreis offensichtlich erneut rendern müssen und wir die Summe erneut rendern müssen wenn wir es sind wenn Sie diese Aktualisierungen vornehmen, ist es besser, die gesamte Tabelle erneut zu rendern. Ich klicke dabei auf „Speichern“ und dann werde ich auf Artikel des Einkaufswagens verweisen. Wie wir bereits beim Produkt gesehen haben, lege ich es zuerst in eine eigene Variable ein, lege ich es zuerst in eine eigene Variable bevor ich die Zufallsmethode darauf ausführe. Da wir dafür eine Methode ausführen werden, möchte ich etwas Ähnliches machen, das im Konstruktor einrichten, also werde ich das hier aufstellen. Wenn wir dann mit Button-Klick laufen , werden wir offensichtlich den Mengenwert ändern. Da wir diese Webkomponente dieser Variablen hier zugewiesen haben , kann ich diese.cart Artikel ausführen und die Methode für diese Webkomponenten ausführen, damit ich die Menge aktualisieren kann, und dafür kann ich muss nur herausfinden, was der Index ist. Ich gehe zu diesem Input-Datensatz-Index, damit ich hier auf diesen Datenindex zugreifen kann. Dies ist im Datensatz-Array verfügbar. Ich hole mir diesen Index. Dann werde ich als zweites Argument this.input.value angeben. klicke ich auf „Speichern“. Jetzt lasst uns hier aktualisieren. Klicken Sie auf „In den Einkaufswagen“. Wie Sie sehen können, wird ich, wenn ich dies abnehme und erhöht, wenn ich dies abnehme und erhöht, die Tabelle der gesamten Warenkorbartikel neu rendern die Tabelle der gesamten Warenkorbartikel und den Gesamt- und den Linienpreis ändern. Jetzt fehlt hier noch eine Sache, und wenn ich das in zwei ändere, wird es nichts ändern. Wenn ich darauf zurückgehe, wird es es ändern, aber wenn ich einen bestimmten Wert einfüge, wird es das nicht ändern. Lassen Sie mich diesen Code ein bisschen mehr umgestalten. Was ich hier machen möchte, ist, dass ich ein individuelles Ereignis erstellen möchte. Denken Sie daran, als wir früher über benutzerdefinierte Ereignisse gesprochen haben, war es nicht wirklich sinnvoll, weil wir nur einen Klick verknüpft und diesen in ein anderes benutzerdefiniertes Ereignis umgewandelt haben. Aber dieses Mal haben wir zwei Möglichkeiten, den Eingabewert zu ändern, dh die Menge in diesem Fall. Wir können einen bestimmten Mengenwert festlegen, oder wir können hier Plus- und Minus-Buttons verwenden. Was ich tun möchte, ist, diese beiden Ereignisse zu einem eigenen Ereignis zu kombinieren , das ich als Change-Event bezeichnen werde. Das ergibt Sinn. Lass es uns in Aktion sehen. Zuallererst werde ich dieses benutzerdefinierte Ereignis erstellen. Ich gehe zu dies.changed-Ereignis wird sein, wie wir zuvor beim Erstellen benutzerdefinierter Ereignisse gesehen haben, erstellen wir ein neues Ereignis, geben ihm einen Namen und dann möchte ich dieses Mal ein JavaScript-Objekt hinzufügen sprudelnd. Ich möchte Blasen auf wahr setzen. Was dies tun wird, ist, dass es auch ein Änderungsereignis in der Webkomponente der Eltern registrieren wird, weil ich möchte, dass es hier registriert wird. Dann erstelle ich hier einen Ereignis-Listener für das Change-Ereignis für diese bestimmten Webkomponenten. Ich werde hier ändern und hier eine Funktion erstellen. Ich hole mir den Input. Es wird hier das Change-Event sein. Was ich dann machen werde , ist, dass ich die Update-Menge hier einfüge. Anstatt diese Methode ausführen zu müssen, wenn wir den Button-Click-Ereignishandler ausführen, und dann auch den Ereignishandler, wenn wir das Element explizit ändern, wie zuvor, wie wir es zuvor getan haben den Button-Click-Ereignishandler ausführen, und dann auch den Ereignishandler, wenn wir das Element explizit ändern, wie zuvor, wie wir es zuvor getan haben Dies, ich werde dieses Änderungsereignis sowohl beim Button-Klick als auch bei dieser Eingabeänderung auslösen. Lassen Sie mich das einfach hier schreiben, und ich werde mich mit der Eingabe befassen, weil wir dort einige seiner Attribute verwenden müssen. Dann werde ich dieses benutzerdefinierte Ereignis versenden, also dieses Änderungsereignis. Da wir dann auf die spezifische Eingabe schauen, kann ich, anstatt hier nichts zu haben was ich tun kann, das Ereignis durchlaufen, und anstatt mir diese Eingabe anzusehen, kann ich einen Verweis auf die Sie hier basierend auf dem aktuellen Ziel des Ereignisses ein. Tut mir leid, ich habe vergessen, den Auftrag da reinzulegen. Dann können wir diesen Punkt von jedem von diesen entfernen. Lasst uns auf „Speichern“ klicken und mal sehen, ob das funktioniert. Ich öffne meine Konsole nur für den Fall, dass es Fehler gibt . In den Warenkorb legen. Leg das auf, nimm das hin. Es funktioniert nicht, weil wir auf Ereignisse in der Webkomponente suchen , die nicht in der Eingabe enthalten sind. Was ich tun werde, ist hier einfach einen zusätzlichen Parameter mit einem JavaScript-Objekt hinzuzufügen , und ich setze Blasen auf „true“. Auf diese Weise springt das Änderungsereignis bis zur Mengeneingabekomponente selbst. Lasst uns auf „Speichern“ klicken, hier aktualisieren und mal sehen, ob das jetzt funktioniert. Sie können keine Eigenschaften einer undefinierten Einstellmenge festlegen, schauen wir uns mal an. Werfen wir einen Blick darauf, was hier durchkommt , Konsolenprotokolleingabe. Werfen wir einen Blick darauf. Das durchläuft die Webkomponente selbst. Das muss daran liegen, dass wir zu der Webkomponente sprudeln , die die Änderung auslöst, und dann wird das aktuelle Ereignisziel in dieser Instanz zur Webkomponente selbst und nicht zur Eingabe. Wir können das beheben, indem wir einfach unsere ausgewählte Abfrage verwenden , um diese Eingabe auszuwählen. Lasst uns auf „Speichern“ klicken , hier aktualisieren, auf „In den Einkaufswagen“ klicken und dann haben wir das gleiche Ergebnis wie zuvor. Dies aktualisiert unsere Mengen und aktualisiert auch unseren Warenkorb. Wie Sie sehen können, funktioniert das nicht. Lass mich das einfach in zwei ändern und dann auf „Tab“ drücken. Wie Sie sehen können, wird es dadurch auf den expliziten Wert geändert. Wie Sie sehen können, nutzen wir, da Änderung bereits ein Ereignis für diese Eingabe ist, da Änderung bereits ein Ereignis für diese Eingabe ist, auch das vorhandene Ereignis, das ausgelöst wird , wenn wir es explizit ändern. Wir fügen im Grunde unseren Button-Klick in das Change-Ereignis ein. Dies geschieht automatisch, wir müssen nicht einmal ein Änderungsereignis registrieren wenn wir diesen Wert explizit ändern, dies geschieht einfach automatisch. Dies ist ein gutes Beispiel dafür , wie wir ein benutzerdefiniertes Ereignis auf etwas markieren können , das bereits existiert. Um das zu bereinigen , haben wir diesen vorherigen Wert hier. Es wird davon ausgegangen, dass wir, wenn wir auf eine Schaltfläche klicken, einen Wert ändern, aber nur um sicher zu sein, dass ich hier eine if-Anweisung hinzufügen werde . Wir werden nur prüfen, ob der vorherige Wert nicht dem neuen Wert entspricht. Wenn ich speichere, aktualisiere, sollten wir das gleiche Ergebnis erzielen wie wir. Das ist nur ein zusätzlicher Scheck. Das ist im Grunde genommen Leute. Wir haben unsere drei Webkomponenten hier. Wir haben unser Produktelement, und wenn ich bei einem dieser Artikel auf „ In den Einkaufswagen“ klicke, interagiert es mit unserer Warenkorbkomponente. Ich kann diese Mengeneingaben verwenden , um die Preise hier zu ändern. Eigentlich haben wir nicht getan, wenn es Null erreicht , wollen wir das entfernen, und wenn die Gesamtzahl Null erreicht , möchten wir die Tabelle ganz entfernen. Ich dachte, wir wären fertig, aber wir haben nur noch eine Sache zu tun, deshalb solltest du immer mit deinen Projekten herumspielen und sehen. Gehen wir in cartitems.js und schreiben wir hier etwas zusätzlichen Code ein. Ich scrolle nach unten. Das erste, was ich tun werde, ist, wenn die Warenkorbsumme Null ist, nun, eigentlich werde ich das Gegenteil machen. Wenn die Warenkorbsumme nicht Null ist, rendern wir die Fußzeile. Wenn die Warenkorbsumme jedoch Null ist, wird dieser Code überhaupt nicht ausgeführt, was bedeutet, dass wir keine Warenkorb-Fußzeile haben wenn diese Renderfunktion ausgeführt wird. Daran spare ich. Was ich dann auch mache, ist, dass ich hier einen ähnlichen Check mache. Kurz nach dem Zeilenpreis werde ich die Zeile nicht zur Tabelle hinzufügen, es sei denn die Artikelmenge ist größer als Null. Wenn es nicht Null ist, werden wir diesen Code ausführen, also schnapp dir das und lege ihn hierher. Drücken Sie dabei auf „Speichern“. Wenn wir nun etwas in den Warenkorb legen, erhöhen Sie die Menge, aber gehen Sie dann wieder auf Null, wodurch das entfernt wird. Sagen wir einfach, wir haben mehrere hier und wir entfernen alle von ihnen aus dem Warenkorb, dann verschwindet der gesamte Warenkorbtisch nicht, es ist nur diese Zeile. Wir können alle hinzufügen, einige von ihnen entfernen, die Menge erhöhen. Wenn dies eine voll funktionsfähige App mit aktivierten Checkout-Funktionalitäten wäre, könnten wir hier eine Schaltfläche haben, die dieses Warenkorb-Array an eine Checkout-Seite sendet , und dann wäre der Benutzer in der Lage um diese Bestellung abzuschließen. Das schließt dieses kleine Klassenprojekt ab. Lassen Sie mich diesen Code einfach angeben, bevor ich es vergesse. Verwerfen Sie erneut den DS Store. Werfen wir einen kurzen Blick darauf, was wir hier geändert haben. Alles sieht gut aus. Wenn Sie Fehler bei irgendeinem davon feststellen, lassen Sie es mich einfach wissen. Kommentare unten, aber ich werde all diese inszenieren und dann das Projekt mit Mengeneingabe abschließen. Ich werde das noch einmal verwerfen. Das ist so ziemlich es Leute. Ich werde diesen Code auf GitHub für dich haben. Suchen Sie einfach auf meiner GitHub-Seite danach, die github.com/christopherdodd ist. Lass mich das loswerden. Überprüfe meine Repositorys und sieh nach, ob du es dort finden kannst. Irgendwelche Fragen. Lassen Sie sie in den Kommentaren unten. Ich hoffe, Ihnen hat diese praktische Anwendung der Verwendung von Web Components gefallen . Hoffentlich können Sie in dieser Klasse, wie wir anscheinend mit der Theorie begonnen haben und auf das Praktische eingegangen sind, wie wir anscheinend mit der Theorie begonnen haben und auf das Praktische eingegangen sind, damit beginnen, zu festigen, was Web Components tut und warum es wichtig ist. Ich sehe Sie im nächsten Video, in dem wir den Kurs abschließen werden, und ich werde mit Ihnen darüber sprechen, wie Sie dieses Klassenprojekt noch weiter erweitern können , wenn Sie möchten. Danke fürs Zuschauen, wir sehen uns im nächsten Video. 13. Abschließende Bemerkungen: Dies schließt unseren Kurs über Webkomponenten ab. Für Ihr Klassenprojekt ermutige ich Sie, Ihre eigene voll funktionsfähige Webkomponente zu erstellen . Zur Inspiration können Sie das, was wir bisher in dieser Klasse getan haben, mit dem E-Commerce-Beispiel nehmen bisher in dieser Klasse getan haben, mit und zusätzliche Funktionen wie Produktfilterung oder Varianzauswahl hinzufügen zusätzliche Funktionen wie . Wenn Sie Fragen oder Bedenken haben, hinterlassen Sie wie immer einen Kommentar im Diskussionsfeld unten und ich werde mein Bestes tun, um Sie in die richtige Richtung zu weisen. Danke wie immer fürs Zuschauen und ich hoffe, Sie auf einigen meiner anderen Kurse wiederzusehen.