8. Projekt [vuejs-06]: Anlegen einer Ansicht mit Slots

8.1. Das Hauptskript [main.js]
Das Hauptskript [main.js] bleibt unverändert.
8.2. Die Hauptkomponente [App]
Der Code für die [App]-Komponente lautet wie folgt:
<template>
<div class="container">
<b-card>
<b-alert show variant="success" align="center">
<h4>[vuejs-06] : mise en page avec des slots</h4>
</b-alert>
<Content />
</b-card>
</div>
</template>
<script>
import Content from './components/Content'
export default {
name: "app",
// composants utilisés
components: {
Content
}
};
</script>
Die Komponente [App] führt eine neue Komponente namens [Content] ein (Zeilen 7, 14, 19).
8.3. Die [Layout]-Komponente
Die [Layout]-Komponente dient dazu, das Layout der Ansichten der Anwendung zu definieren:
<template>
<!-- line -->
<b-row>
<!-- three-column zone -->
<b-col cols="3" v-if="left">
<slot name="slot-left" />
</b-col>
<!-- nine-column zone -->
<b-col cols="9" v-if="right">
<slot name="slot-right" />
</b-col>
</b-row>
</template>
<script>
export default {
name: "patron",
// paramètres
props: {
left: {
type: Boolean
},
right: {
type: Boolean
}
}
};
</script>
Kommentare
- Die Komponente [Layout] definiert eine einzelne Zeile (Zeilen 3–12). Diese Zeile ist in zwei Spalten unterteilt:
- eine Spalte, die aus 3 Bootstrap-Spalten besteht (Zeilen 5–7);
- eine Spalte, die aus 9 Bootstrap-Spalten besteht (Zeilen 9–11);
- Zeile 5: Das Vorhandensein der linken Spalte (Zeilen 5–7) hängt vom Wert des Parameters [left] ab, der in der Eigenschaft [props] der Komponente definiert ist (Zeilen 20–22);
- Zeile 9: Das Vorhandensein der rechten Spalte (Zeilen 9–11) hängt vom Wert des Parameters [right] ab, der in der Eigenschaft [props] der Komponente definiert ist (Zeilen 23–25);
- Die Werte der Parameter [left, right] müssen von einer übergeordneten Komponente der [Layout]-Komponente festgelegt werden;
- Zeile 6: Der Inhalt der linken Spalte ist nicht festgelegt. Wir geben dieser Spalte lediglich mithilfe des Tags <slot> einen Namen. Hier wird sie [slot-left] heißen. Eine Komponente, die die [Content]-Komponente verwendet, muss angeben, was sie in den Bereich namens [slot-left] einfügen möchte;
- Zeile 10: Die rechte Spalte wird [slot-right] heißen;
8.4. Die [Right]-Komponente
Die [Right]-Komponente sieht wie folgt aus:
<template>
<!-- a message in a warning-type alert -->
<b-alert show variant="warning" align="center">
<h4>{{msg}}</h4>
</b-alert>
</template>
<!-- script -->
<script>
export default {
name: "droite",
// paramètres
props: {
msg: String
}
};
</script>
- Zeilen 3–5: Die Komponente [Right] zeigt eine Meldung in einem [warning]-Alarm an. Diese Meldung [msg] ist in Zeile 14 als Komponentenparameter definiert. Die übergeordnete Komponente muss ihr daher einen Wert zuweisen;
8.5. Die [Left]-Komponente
Die [Left]-Komponente sieht wie folgt aus:
<template>
<!-- a message in a primary alert -->
<b-alert show variant="primary" align="center">
<h4>{{msg}}</h4>
</b-alert>
</template>
<!-- script -->
<script>
export default {
name: "gauche",
// paramètres
props: {
msg: String
}
};
</script>
- Zeilen 3–5: Die Komponente [Left] zeigt eine Meldung in einem [primären] Alert an. Diese Meldung [msg] ist in Zeile 14 als Komponentenparameter definiert. Die übergeordnete Komponente muss ihr daher einen Wert zuweisen;
8.6. Die [Content]-Komponente
Zur Erinnerung: Die [Content]-Komponente ist die Komponente, die von der Hauptansicht [App.vue] angezeigt wird:
<template>
<div>
<!-- colonnes gauche et droite remplies -->
<Layout :left="true" :right="true">
<Right slot="slot-right" msg="slot [slot-right] présent et rempli" />
<Left slot="slot-left" msg="slot [slot-left] présent et rempli" />
</Layout>
<!-- colonnes gauche basente. colonne droite remplie -->
<Layout :left="false" :right="true">
<Right slot="slot-right" msg="slot [slot-right] présent et rempli, slot [slot-left] absent" />
</Layout>
<!-- colonnes gauche remplie, colonne droite absente -->
<Layout :left="true" :right="false">
<Left slot="slot-left" msg="slot [slot-left] présent et rempli, slot [slot-right] absent" />
</Layout>
<!-- colonnes gauche présente mais pas remplie, colonne droite remplie -->
<Layout :left="true" :right="true">
<Right slot="slot-right" msg="slot [slot-right] présent et rempli, slot [slot-left] présent mais vide" />
</Layout>
</div>
</template>
<!-- script -->
<script>
import Layout from "./Layout";
import Left from "./Left";
import Right from "./Right";
export default {
name: "contenu",
// composants
components: {
Layout,
Left,
Right
}
};
</script>
Visuelle Darstellung

Kommentare
- Die [Layout]-Komponente wird viermal verwendet (Zeilen 4–7, 9–11, 13–15, 17–19). Da die [Layout]-Komponente eine Zeile definiert, definiert die obige [template] vier Zeilen. Außerdem definiert die [Layout]-Zeile zwei Spalten:
- eine Spalte namens [slot-left], die die 3 linken Bootstrap-Spalten einnimmt;
- eine Spalte namens [slot-right], die die 9 rechten Bootstrap-Spalten einnimmt;
- Zeilen 4–7: definieren eine [1]-Zeile, in der die [Left]-Komponente die [slot-left]-Spalte einnimmt und die [Right]-Komponente die [slot-right]-Spalte einnimmt;
- Zeilen 9–11: definieren eine Zeile [2], in der die Spalte [slot-left] nicht angezeigt wird und die Komponente [Right] die Spalte [slot-right] einnimmt;
- Zeilen 13–15: Definiert eine Zeile [3], in der die Spalte [slot-right] nicht angezeigt wird und die Komponente [Left] die Spalte [slot-left] einnimmt;
- Zeilen 17–19: Definiert eine Zeile [4], in der die Spalte [slot-left] angezeigt wird [:left=’true’], aber nicht gefüllt ist, und die Komponente [Right] die Spalte [slot-right] einnimmt;
Letztendlich diente die [Layout]-Komponente als Layout für die [Content]-Komponente.