3. Projekt [vuejs-01]: Die Grundlagen
Um den in [vuejs-00] ausgeführten Code zu erklären, werden wir ihn in [vuejs-01] vereinfachen. Wir duplizieren den Ordner [vuejs-00] in [vuejs-01]:

Das Projekt [vuejs-01] umfasst im Wesentlichen vier Dateien:
- [main.js] und [2] sind der Einstiegspunkt des Projekts;
- [App.vue, HelloWorld.vue] und [3-4] sind Komponenten von [Vue.js] und können optional folgende Elemente enthalten:
- [<template>...</template>]: Code aus HTML;
- [<script>...</script>]: den mit dem Code HTML verbundenen JavaScript-Code;
- [<style>...</style>]: das Stilblatt CSS, das dem Code HTML zugeordnet ist;
- [public/index.html] [5]: das Dokument HTML, das durch den Befehl [npm run serve] angezeigt wird;
Die bei der Ausführung des Projekts angezeigte Datei [public/index.html] ist folgende:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>vuejs</title>
</head>
<body>
<noscript>
<strong>We're sorry but vuejs doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<!-- Die erstellten Dateien werden automatisch eingefügt -->
</body>
</html>
Diese Datei HTML zeigt also statisch nichts an. Hier gibt es keinen Code HTML. Die Anzeige erfolgt dynamisch: Der Code jS des Projekts generiert den Code HTML, der das Tag [<div id=’app’>] in Zeile 14 vollständig ersetzt. Der Code „HTML“, der durch den Projektcode „jS“ generiert und anstelle des Tags „[<div>]“ in Zeile 14 eingefügt wurde, stammt aus den Tags „[template]“ der Komponenten „[vue.js], wobei die Dateien die Endung [.vue] tragen.
Der Code HTML wird in Zeile 14 dynamisch durch das folgende Skript [vuejs-01/main.js] eingefügt:
// Importe
import Vue from 'vue'
import App from './App.vue'
// Konfiguration
Vue.config.productionTip = false
// Projektinstanziierung [App]
new Vue({
render: h => h(App),
}).$mount('#App')
Anmerkungen
- Zeile 2: Das Objekt [Vue] wird vom Framework [vue.js] bereitgestellt;
- Zeile 3: Das Objekt [App] wird von der Datei [vuejs-01/App.vue] bereitgestellt;
- Zeile 6: Konfiguration des Objekts [Vue];
- Zeilen 9–11: Dies sind die Zeilen, die
- den Code HTML der Anwendung generieren. In Zeile 10 wird dieser durch die Datei [App.vue] generiert;
- den in Zeile 10 generierten Code „HTML“ in den Abschnitt „[<div id=’app’></div>]“ der Datei „[public/index.html]“ laden;
Jedes Projekt [Vue.js] kann die Datei [index.html] unverändert beibehalten.
Die Datei [App.vue] aus dem ursprünglichen Projekt [vuejs-00] wird im Projekt [vuejs-01] wie folgt vereinfacht:
<template>
<div id="myApp">
<img alt="Vue logo" src="./assets/logo.png" />
<HelloWorld msg="Notre première application Vue.js" />
</div>
</template>
<script>
import HelloWorld from "./components/HelloWorld.vue";
export default {
name: "app",
components: {
HelloWorld
}
};
</script>
Kommentare
- Ein Fragment [.vue] besteht aus höchstens drei Abschnitten:
- [<template>...</template>]: aus dem Code HTML;
- [<script>...</script>]: der JavaScript-Code, der dem Code HTML zugeordnet ist;
- [<style>...</style>]: das Stil-Element CSS, das dem Code HTML zugeordnet ist;
Hier gibt es keinen Abschnitt [style].
- Zeilen 1–6: der Code HTML des Fragments (Seite, Komponente, Ansicht, …);
- Zeilen 2–5: Der Abschnitt [template] darf nur ein Element enthalten. In der Regel wird ein Abschnitt [div] eingefügt, der das gesamte HTML des Fragments umfasst. Es kann auch ein <template>-Tag eingefügt werden;
- Zeile 3: ein Bild;

- Zeile 4: eine Komponente mit dem Namen [HelloWorld]. Das Prinzip von [Vue.js] besteht darin, Webseiten mithilfe von Fragmenten zu erstellen, die in [.vue]-Dateien definiert sind, wie hier [App.vue]. Diese Komponente wird durch die Datei [HelloWorld.vue] definiert, die in Zeile 9 des zugehörigen Skripts jS definiert ist;
- Zeile 4: Eine Komponente kann Parameter akzeptieren. Der Parameter ist hier das Attribut [msg];
- Zeilen 8–17: das Skript jS des Fragments (oder der Komponente);
- Zeile 9: Um die Komponente [HelloWorld] in der Komponente [App] verwenden zu können, muss ihre Definition in den Teil [script] importiert werden;
- Zeilen 11–16: Das Skript definiert ein Objekt und exportiert es, um es extern verfügbar zu machen;
- Zeile 12: Das Attribut [name] definiert den Namen der exportierten Komponente;
- Zeilen 13–15: Das Attribut [components] listet die von der Komponente [App] verwendeten Komponenten auf. Diese werden zusammen mit ihr exportiert;
Zeile 9: Es besteht keine Verpflichtung, dass die Komponente [HelloWorld] denselben Namen trägt wie die Datei, die sie definiert. Man könnte sie als [X] importieren und als Komponente [Bonjour] exportieren:

- Zeile 14: Die Komponente [X] wird unter dem Namen [Bonjour] exportiert. Sie wird dann unter diesem Namen verwendet (Zeile 4);
Die erste Variante ist die gängigste, daher werden wir unsere Komponenten auf diese Weise definieren;
<template>
<div id="myApp">
<img alt="Vue logo" src="./assets/logo.png" />
<HelloWorld msg="Notre première application Vue.js" />
</div>
</template>
<script>
import HelloWorld from "./components/HelloWorld.vue";
export default {
name: "app",
components: {
HelloWorld
}
};
</script>
Zeile 14 ist eine Abkürzung für den Code [HelloWorld : HelloWorld]: Die Komponente [HelloWorld] (rechts, in Zeile 9 importiert) wird unter dem Namen [HelloWorld] (links) exportiert.

Wir vereinfachen die Komponente [HelloWorld.vue] wie folgt:
<template>
<div>
<h1>{{ msg }}</h1>
</div>
</template>
<script>
export default {
name: "HelloWorld",
props: {
msg: String
}
};
</script>
Anmerkungen
- Die Komponente [HelloWorld] hat dieselbe Dateistruktur wie die Hauptkomponente [App];
- Zeile 3: Hier findet die Auswertung eines JavaScript-Ausdrucks statt, in diesem Fall des Ausdrucks [msg];
- Zeilen 10–12: Hier werden die Eigenschaften der Komponente, genauer gesagt ihre Parameter, definiert. Als die Komponente [App] eine Komponente [HelloWorld] instanziiert hat, erfolgte dies mit folgender Syntax:
<HelloWorld msg="Notre première application Vue.js" />
Die Komponente [HelloWorld] wird instanziiert, indem dem Parameter (Attribut) [msg] ein Wert zugewiesen wird. Folgt man dem [template] der Komponente [HelloWorld], so lautet dieser:
<div>
<h1>Notre première application Vue.js</h1>
</div>
- Zeilen 7–14: Die Eigenschaften der Komponente, definiert als Objekt, das exportiert wird;
- Zeile 9: Die Komponente wird unter dem Namen [HelloWorld] exportiert;
- Zeilen 10–12: Ihre Parameter werden durch die Eigenschaft [props] definiert;
Wenn man schließlich die Vorlagen der beiden verwendeten Komponenten [App, HelloWorld] zusammenführt, sieht die angezeigte Datei [index.html] wie folgt aus:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title>vuejs</title>
</head>
<body>
<noscript>
<strong>We're sorry but vuejs doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="myApp">
<img alt="Vue logo" src="./assets/logo.png" />
<div>
<h1>Notre première application Vue.js</h1>
</div>
</div></body>
</html>
Wir starten die Anwendung, indem wir den Befehl [serve] [1] in der Datei [package.json] ändern:

Die angezeigte Seite lautet dann [2].
Sehen wir uns nun den Code dieser Seite an:

- in [1], ändern in [clic droit];
- in [2], der Quellcode der Seite. Wir sehen, dass es sich um den Code der ursprünglichen Datei [index.html] handelt, und dass nicht dieser angezeigt wurde. Tatsächlich wurde zunächst die Seite [index.html] geladen. Anschließend hat JavaScript diese Seite dynamisch verändert, was uns jedoch nicht angezeigt wird;
Wenn Seiten dynamisch durch JavaScript generiert werden, ist die Option [2] nutzlos. Man muss in die Browser-Tools (F12 in Firefox) gehen, um den Code der aktuell angezeigten Seite zu sehen:

- in [1], dem Inspektor des DOM (Document Object Model) des angezeigten Dokuments;
- in [2], was dieses DOM tatsächlich enthält;
- [3-4], die Tools, die wir verwenden werden, um die vom Framework [Vue.js] verwendeten JavaScript-Objekte anzuzeigen;
- [4] ist eine Erweiterung (hier für Firefox) zum Debuggen von [Vue.js]-Anwendungen:
- für Firefox: [https://addons.mozilla.org/fr/firefox/addon/vue-js-devtools/];
- für Chrome: [https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd];
Sehen wir uns die Registerkarte [Vue] [4] an:

Die Ansicht „[1-4]“ zeigt uns die Struktur „[Vue.js]“ des Dokuments: Die Wurzel des Dokuments [2] (index.html) enthält die Komponente [App] (3), die wiederum die Komponente [HelloWorld] (4) enthält. Ein Klick auf [4] zeigt die Eigenschaften der Komponenten [HelloWorld] und [5] an.
In [4] (rechts) ist der Indikator [$vm0] zu sehen. Dies ist der Name der Variablen, die man in der Konsole JavaScript [6] verwenden kann, um das Objekt [HelloWorld] zu bezeichnen. Machen wir das:

- In [2] lassen wir den Ausdruck [$vm0] auswerten, wodurch dessen Struktur angezeigt wird. Normalerweise müssen wir diese Struktur nicht direkt verwenden;
Zum Abschluss zeigen wir die Funktion von [hot reload] im Befehl [serve], der zur Ausführung des Projekts verwendet wird:
- Ändern Sie in [App.vue] die von [HelloWorld] angezeigte Meldung:

- In [1] wird die angezeigte Meldung geändert;
- in [2-3] wird die Seite automatisch aktualisiert, ohne dass wir eingreifen müssen;
Wir werden nun verschiedene Projekte [vuejs-xx] erstellen, um die wichtigen Punkte von [Vue.js] zu veranschaulichen. Unter „wichtig“ ist zu verstehen: „die wir im Client [vue.js] des Steuerberechnungsservers verwenden werden“. Andere „wichtige“ Punkte werden nicht behandelt, wenn sie im Client nicht verwendet werden. Es handelt sich also nicht um eine umfassende Darstellung von [vue.js].