> KeepCoding Projekte - Web 18: 📁 repos-kc-web-18.md
> Wähle deine Sprache: Englisch 🔄 Spanish
Dieses Projekt hat zum Ziel, die technische Problemerkennung, auch bekannt als Componentization, zu üben, um die möglichen Komponenten der vorgeschlagenen Lösung zu identifizieren und zu klären.
Dabei sollen zuvor erarbeitete Konzepte wie Wiederverwendung, Isolation, Kapselung und Single Responsibility Principle angewendet werden, um eine konsistente Komponentenstruktur zu entwerfen, die den Prinzipien moderner Entwicklung entspricht.
Web Components sind eine Sammlung nativer Browser-Technologien, mit denen man wiederverwendbare, benutzerdefinierte HTML-Elemente erstellen kann, die ihr eigenes Verhalten und Styling besitzen, kapselbar sind und zwischen verschiedenen Frameworks oder Projekten portabel bleiben.
- Interoperabilität: Ermöglichen den Einsatz von Komponenten unabhängig vom Framework (React, Vue, Angular usw.).
- Isolation: Kapseln Styles und Logik, um Konflikte mit dem Rest der Anwendung zu vermeiden.
- Wiederverwendbarkeit: Erleichtern das Teilen und Wiederverwenden von Komponenten in mehreren Projekten.
- Kapselung: Trennen deutlich die interne Logik und das Styling des Components vom Außenbereich.
- DRY (Don’t Repeat Yourself): Verhindern von Code-Duplikation durch Erstellung wiederverwendbarer Komponenten.
- COP (Component Oriented Programming): Fördern einen modularen, komponentenbasierten Ansatz.
- SRP (Single Responsibility Principle): Sicherstellen, dass jede Komponente nur eine einzige, klare Aufgabe erfüllt.
- HTML-Templates: Definieren wiederverwendbare HTML-Schnipsel, ohne dass sie automatisch gerendert werden.
- Custom Elements: Registrieren neuer, benutzerdefinierter HTML-Tags mit eigenem Verhalten.
- Shadow DOM: Kapselt das DOM und CSS des Components, um externe Einflüsse zu vermeiden.
- ES Modules: Importieren und Exportieren von JavaScript-Code in modularer, wiederverwendbarer Weise.
constructor()– Wird beim Instanziieren des Components ausgeführt. Ideal, um Eigenschaften zu initialisieren.connectedCallback()– Wird aufgerufen, wenn das Component dem DOM hinzugefügt wird. Typischerweise für Rendering-Logik.disconnectedCallback()– Läuft, wenn das Component aus dem DOM entfernt wird. Ideal zum Aufräumen von Event-Listenern.adoptedCallback()– Wird aufgerufen, wenn das Element in ein neues Dokument verschoben wird.attributeChangedCallback()– Erkennt Änderungen beobachteter Attribute und erlaubt dynamisches Reagieren darauf.
- Verantwortung: Jede Komponente muss nur eine einzige, klare Aufgabe erfüllen.
- Custom Properties: Verwenden von CSS-Variablen, um externes Styling anzupassen.
- Attribute: Konfigurieren das Verhalten oder Aussehen des Components über HTML-Attribute.
- Events: Komponenten sollten in der Lage sein, eigene Events auszulösen und darauf zu reagieren, um mit der Umgebung zu kommunizieren.
-
Verantwortung
- Erfasst Text vom Benutzer und zeigt einen Button an.
- Hält den Button deaktiviert, wenn das Feld leer ist.
- Beim Klick löst es
input-action-submitmit dem eingegebenen Text aus und leert das Eingabefeld.
-
Struktur (Shadow DOM)
- Enthält ein
<input>und einen<button>. - Attribute:
button-label(Button-Text, Standard „Add“)placeholder(Placeholder-Text fürs Input, Standard „Add Your Task“)type(Input-Typ, Standard „text“)
- Enthält ein
-
Verantwortung
- Zeigt eine Aufgabe mit Checkbox, Text und Lösch-Button an.
- Ist die Checkbox aktiviert, erscheint der Text durchgestrichen.
- Beim Ändern der Checkbox löst es
action-item-status-updateaus mit{ id, text, isChecked }. - Beim Klick auf den Lösch-Button löst es
action-item-removeaus mit{ id }und entfernt sich selbst aus dem DOM.
-
Struktur (Shadow DOM)
- Enthält
<input type="checkbox">, ein<span>für den Text und einen<button>. - Attribute:
text(Aufgabentext)is-checked(markiert, ob sie erledigt ist)button-label(Button-Text, Standard „Delete“)id(eindeutiger Bezeichner)
- Enthält
-
Synchronisation
observedAttributes:text,is-checked,id.attributeChangedCallbackaktualisiert<span>oder Checkbox-Zustand, wenn sich Attribute extern ändern.
-
Verantwortung
- Kombiniert
InputActionund mehrereTodoItem. - Liest und speichert Aufgaben in
localStorageunter dem Schlüssel"todos". - Erlaubt Erstellen, Markieren, Abhaken und Löschen von Aufgaben sowie das Entfernen aller erledigten Aufgaben.
- Kombiniert
-
Struktur (Shadow DOM)
- Enthält ein
<input-action>, einen Container für die Items und einen Button „Clean Completed Tasks“.
- Enthält ein
-
Hauptablauf
- Beim Empfangen von
input-action-submitwird ein Objekt{ text, isCompleted: false, id: UUID }erzeugt, inlocalStoragegespeichert undaddTodo(...)aufgerufen. addTodofügt ein<todo-item>mit den Attributentext,idundis-checked(falls erledigt) ein.- Jedes
TodoItemmeldet Änderungen:action-item-status-update: Aktualisiert die Aufgabe inlocalStorageund den Zustand des „Clean“-Buttons.action-item-remove: Entfernt die Aufgabe auslocalStorage, löscht das Element und aktualisiert den Button.
- „Clean Completed Tasks“ filtert alle erledigten Aufgaben heraus, aktualisiert
localStorageund entfernt die durchgestrichenen Items aus dem DOM.
- Beim Empfangen von
-
Initiale Einrichtung
showStoredTodos(): Lädt aus dem Speicher und rendert alle gespeicherten Aufgaben.manageCleanButton(): Aktiviert oder deaktiviert den „Clean“-Button, abhängig davon, ob erledigte Aufgaben vorhanden sind.
- Sprachen: HTML, CSS und JavaScript.
- Bemerkenswerte Abhängigkeiten (Node.js): Tailwindcss und Parcel.
- Node.js (getestet mit Version v22.15.1)
- Git (getestet mit Version 2.47.1.windows.1)
- Visual Studio Code (getestet mit Version 1.99.0)
- Live Server (VS Code-Erweiterung, optional)
git clone https://github.com/pablo-sch/keepcoding-07-web-components.git> Klon-Demo in VSCode ansehen: 🎥 Gif Demo
# Installiere die Projektabhängigkeiten.
npm install
# Starte den Entwicklungsserver mit Parcel.
npm start
# Starte den Server und öffne den Browser automatisch.
npm start:open
# Bereinige den dist-Ordner und erstelle die produktionsbereite Version.
npm build
# Lösche den dist-Ordner.
npm clear> Projektvorschau: 👀 Vorschau
Projekt unter MIT-Lizenz. Frei zur Nutzung und Verbreitung mit Namensnennung. Externe Beiträge werden nicht akzeptiert, aber Vorschläge sind willkommen.