Gewohnheiten aus einer Datei
Ein neuer Tracker sollte mit ein paar Vorschlägen starten, und deiner lädt sie aus einer Datei, so wie das Café in der Lektion Lebenszyklus und Daten seine Speisekarte geladen hat. Sie stehen in gewohnheiten.json im letzten Tab: die drei Gewohnheiten aus App.vue und zwei weitere, damit du siehst, wann die Liste aus der Datei kommt.
Die App lädt die Datei in onMounted, sobald die Komponente auf der Seite ist. Bis die Datei ankommt, ist gewohnheiten ein leeres Array, und zwei weitere Refs sagen, was gerade passiert: laedt ist true, bis die Antwort kommt, und fehler bekommt eine Nachricht, wenn die Datei nicht geladen werden kann:
const gewohnheiten = ref([]);
const laedt = ref(true);
const fehler = ref("");
onMounted(async () => {
const antwort = await fetch("gewohnheiten.json");
if (!antwort.ok) {
fehler.value = "Die Gewohnheiten konnten nicht geladen werden.";
} else {
gewohnheiten.value = await antwort.json();
}
laedt.value = false;
});
Warum nicht einfach await fetch() ganz oben in <script setup>? Wie du in der Lektion Lebenszyklus und Daten gesehen hast, zeigt die Komponente dann gar nichts an. Mit onMounted ist die Seite sofort da, und die Gewohnheiten kommen einen Moment später.
Die Vorlage zeigt eines von drei Dingen: solange die Datei lädt, eine Meldung, die das sagt; bei einem Fehler den Fehler; und sonst die Liste. Die Elemente mit v-if, v-else-if und v-else müssen direkt aufeinander folgen:
<p v-if="laedt">Lädt…</p>
<p v-else-if="fehler" class="fehler">{{ fehler }}</p>
<ul v-else class="gewohnheiten">
Die Klasse fehler macht die Meldung rot; du findest sie in style.css.
Typische Fehler:
.valuevergessen:gewohnheiten = await antwort.json();versucht, das Array in die Konstante selbst zu schreiben, und die Konsole zeigtTypeError: Assignment to constant variable.awaitvorantwort.json()vergessen.gewohnheitenenthält dann ein Promise statt des Arrays, und die Liste bleibt leer.
So schreibst du es:
Anweisungen
- 1
Ersetze im Script das Array der Gewohnheiten durch den Code von oben, komplett, und füge
onMountedzum Import aus"vue"hinzu (die Namen in alphabetischer Reihenfolge:import { onMounted, ref } from "vue";). Nach einem Moment zeigt die Seite fünf Gewohnheiten. - 2
Zeige in der Vorlage vor der Liste
Lädt…oder den Fehler an, mit den Elementen von oben (dasulbekommtv-else, sein Inhalt bleibt, wie er ist). Um den Fehler zu sehen, ändere den Namen der Datei infetch()ingewohnheitn.json, eine Datei, die es nicht gibt, und führe den Code aus. Ändere ihn dann zurück.