Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:m291:learningunits:lu10:theorie:a_components [2026/05/02 22:18] – angelegt gkoch | de:modul:m291:learningunits:lu10:theorie:a_components [2026/05/10 20:32] (aktuell) – gkoch | ||
|---|---|---|---|
| Zeile 3: | Zeile 3: | ||
| ===== Lernziele ===== | ===== Lernziele ===== | ||
| - | * Sie können ein Array of Objects | + | * Sie können ein Array of Objects erstellen und im Template ausgeben. |
| * Sie können mit '' | * Sie können mit '' | ||
| * Sie können Daten via Props von einer Eltern- an eine Kind-Komponente übergeben. | * Sie können Daten via Props von einer Eltern- an eine Kind-Komponente übergeben. | ||
| - | * Sie verstehen, warum lokaler State in der Kind-Komponente sinnvoller ist als ein geteilter State im Parent. | ||
| - | ---- | ||
| ===== Repetition: Was wir in LU09 gelernt haben ===== | ===== Repetition: Was wir in LU09 gelernt haben ===== | ||
| Zeile 14: | Zeile 12: | ||
| <WRAP box center round 80%> | <WRAP box center round 80%> | ||
| ==== Video: ref(), Mustache-Syntax und Komponentenstruktur ==== | ==== Video: ref(), Mustache-Syntax und Komponentenstruktur ==== | ||
| - | {{: | + | {{: |
| \\ | \\ | ||
| //Aus dem Vue Mastery Crash Course (Englisch, deutsche Untertitel, 2:35 Min.)// | //Aus dem Vue Mastery Crash Course (Englisch, deutsche Untertitel, 2:35 Min.)// | ||
| Zeile 27: | Zeile 25: | ||
| | '' | | '' | ||
| | '' | | '' | ||
| - | | '':'' | + | | '':'' |
| | '' | | '' | ||
| </ | </ | ||
| - | |||
| - | ---- | ||
| ===== Von einem Objekt zu einem Array of Objects ===== | ===== Von einem Objekt zu einem Array of Objects ===== | ||
| Zeile 75: | Zeile 71: | ||
| Jedes Objekt hat drei Eigenschaften: | Jedes Objekt hat drei Eigenschaften: | ||
| - | ---- | ||
| ===== v-for: Dynamisch über ein Array iterieren ===== | ===== v-for: Dynamisch über ein Array iterieren ===== | ||
| Zeile 81: | Zeile 76: | ||
| <WRAP box center round 80%> | <WRAP box center round 80%> | ||
| ==== Video: v-for und Arrays ==== | ==== Video: v-for und Arrays ==== | ||
| - | {{: | + | {{: |
| \\ | \\ | ||
| //Aus dem Vue Mastery Crash Course (Englisch, deutsche Untertitel, 2:52 Min.)// | //Aus dem Vue Mastery Crash Course (Englisch, deutsche Untertitel, 2:52 Min.)// | ||
| Zeile 111: | Zeile 106: | ||
| </ | </ | ||
| - | Vue rendert für jedes Element im Array automatisch ein neues ''< | + | Vue rendert für jedes Element im Array automatisch ein neues '' |
| ==== Das key-Attribut ==== | ==== Das key-Attribut ==== | ||
| Zeile 126: | Zeile 122: | ||
| <WRAP tip round> | <WRAP tip round> | ||
| - | '': | + | '': |
| - | Verwenden Sie nie den Index des Arrays als Key, wenn sich die Reihenfolge ändern kann. | + | |
| </ | </ | ||
| - | |||
| - | ---- | ||
| ===== Das Problem mit einem gemeinsamen State ===== | ===== Das Problem mit einem gemeinsamen State ===== | ||
| - | Wenn wir '' | + | Wenn wir '' |
| <WRAP box center round 80%> | <WRAP box center round 80%> | ||
| Zeile 147: | Zeile 140: | ||
| Die Lösung: Jede Frage-Antwort-Einheit bekommt ihren **eigenen State** – durch eine eigene Komponente. | Die Lösung: Jede Frage-Antwort-Einheit bekommt ihren **eigenen State** – durch eine eigene Komponente. | ||
| - | |||
| - | ---- | ||
| ===== Komponenten: | ===== Komponenten: | ||
| Zeile 154: | Zeile 145: | ||
| Eine **Komponente** ist ein abgeschlossener UI-Baustein mit eigenem Template, eigenem Script und eigenem Style. Sie kann beliebig oft verwendet werden. | Eine **Komponente** ist ein abgeschlossener UI-Baustein mit eigenem Template, eigenem Script und eigenem Style. Sie kann beliebig oft verwendet werden. | ||
| - | {{: | + | {{: |
| - | In unserem Accordion: | + | |
| + | Jede '' | ||
| + | |||
| + | ===== Props: Daten vom Parent zum Kind ===== | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Mit **Props** können wir Daten von einer Eltern-Komponente an eine Kind-Komponente übergeben. | ||
| <WRAP box center round 80%> | <WRAP box center round 80%> | ||
| - | <code> | + | < |
| - | Accordion.vue (Parent) | + | <template> |
| - | │ | + | |
| - | │ → gibt Daten per Props weiter | + | |
| - | │ | + | |
| - | ├── AccordionItem.vue | + | |
| - | ├── AccordionItem.vue | + | |
| - | └── AccordionItem.vue | + | |
| - | </code> | + | |
| - | </WRAP> | + | |
| - | Jede '' | + | <!-- Elternkomponente mit : |
| + | <AccordionItem | ||
| - | ---- | + | </ |
| - | ===== Props: Daten vom Parent zum Kind ===== | + | <script setup> |
| - | **Props** sind der Weg, wie ein Parent Daten an eine Kind-Komponente | + | // Kind-Komponente |
| + | // AccordionItem.vue empfängt: faq: Object (Datentyp) | ||
| + | const props = defineProps({ | ||
| + | faq: Object, | ||
| + | }); | ||
| - | <WRAP box center round 80%> | + | </script> |
| - | <code javascript> | + | |
| - | // Funktion mit Parameter | + | |
| - | function greet(name) { | + | |
| - | console.log(' | + | |
| - | } | + | |
| - | // Komponente mit Prop | ||
| - | // AccordionItem.vue empfängt: faq | ||
| </ | </ | ||
| </ | </ | ||
| Zeile 219: | Zeile 207: | ||
| '': | '': | ||
| + | |||
| + | === Warum braucht auch :faq einen Doppelpunkt? | ||
| + | |||
| + | <WRAP box center round 80%> | ||
| + | <code html> | ||
| + | <!-- Ohne Doppelpunkt: | ||
| + | < | ||
| + | |||
| + | <!-- Mit Doppelpunkt: | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Ohne '':'' | ||
| ==== Props im Template verwenden ==== | ==== Props im Template verwenden ==== | ||
| Zeile 237: | Zeile 239: | ||
| </ | </ | ||
| - | ---- | ||
| ===== Finaler Code ===== | ===== Finaler Code ===== | ||
| Zeile 330: | Zeile 331: | ||
| </ | </ | ||
| - | ---- | ||
| ===== Zusätzliche Videos zur Vertiefung ===== | ===== Zusätzliche Videos zur Vertiefung ===== | ||
| Zeile 336: | Zeile 336: | ||
| <WRAP box center round 80%> | <WRAP box center round 80%> | ||
| ^ Video ^ Inhalt ^ Dauer ^ | ^ Video ^ Inhalt ^ Dauer ^ | ||
| - | | [[#|Video 2 – v-bind]] | Attribute dynamisch binden | 3:22 Min. | | + | | [[https:// |
| - | | [[#|Video 3 – v-on]] | Events und EventListener | 2:42 Min. | | + | | [[https:// |
| - | | [[#|Video 4 – Style & Class Binding]] | Klassen und Styles dynamisch setzen | 4:50 Min. | | + | | [[https:// |
| - | | [[#|Video 1 – create-vue (Scrimba)]] | Projekt anlegen mit create-vue | 3:07 Min. | | + | | [[https:// |
| </ | </ | ||