8. progetto [vuejs-06]: impaginazione di una vista con gli slot

8.1. Lo script principale [main.js]
Lo script principale [main.js] rimane invariato.
8.2. Il componente principale [App]
Il codice per il componente [App] è il seguente:
<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>
Il componente [App] introduce un nuovo componente chiamato [Content] (righe 7, 14, 19).
8.3. Il componente [Layout]
Il componente [Layout] viene utilizzato per definire il layout delle viste dell'applicazione:
<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>
Commenti
- Il componente [Layout] definisce una singola riga (righe 3–12). Questa riga è divisa in due colonne:
- una colonna composta da 3 colonne Bootstrap (righe 5–7);
- una colonna composta da 9 colonne Bootstrap (righe 9–11);
- riga 5: la presenza della colonna di sinistra (righe 5–7) dipende dal valore del parametro [left], definito nella proprietà [props] del componente (righe 20–22);
- riga 9: la presenza della colonna destra (righe 9–11) dipende dal valore del parametro [right], definito nella proprietà [props] del componente (righe 23–25);
- i valori dei parametri [left, right] devono essere impostati da un componente padre del componente [Layout];
- riga 6: il contenuto della colonna di sinistra non è specificato. Assegniamo semplicemente un nome a questa colonna utilizzando il tag <slot>. In questo caso, si chiamerà [slot-left]. Un componente che utilizza il componente [Content] deve specificare cosa desidera inserire nell'area denominata [slot-left];
- riga 10: la colonna di destra si chiamerà [slot-right];
8.4. Il componente [Right]
Il componente [Right] è il seguente:
<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>
- righe 3–5: Il componente [Right] visualizza un messaggio in un avviso [warning]. Questo messaggio [msg] è definito come parametro del componente alla riga 14. Il componente padre deve quindi fornirgli un valore;
8.5. Il componente [Left]
Il componente [Left] è il seguente:
<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>
- righe 3–5: Il componente [Left] visualizza un messaggio in un avviso [primary]. Questo messaggio [msg] è definito come parametro del componente alla riga 14. Il componente padre deve quindi fornirgli un valore;
8.6. Il componente [Content]
Ricordiamo che il componente [Content] è il componente visualizzato dalla vista principale [App.vue]:
<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>
Rendering visivo

Commenti
- Il componente [Layout] viene utilizzato 4 volte (righe 4–7, 9–11, 13–15, 17–19). Poiché il componente [Layout] definisce 1 riga, il [template] sopra riportato definisce quattro righe. Inoltre, la riga [Layout] definisce due colonne:
- una colonna denominata [slot-left] che occupa le 3 colonne Bootstrap di sinistra;
- una colonna denominata [slot-right] che occupa le 9 colonne Bootstrap di destra;
- Righe 4–7: definisce una riga [1] in cui il componente [Left] occupa la colonna [slot-left] e il componente [Right] occupa la colonna [slot-right];
- righe 9–11: definiscono una riga [2] in cui la colonna [slot-left] non viene visualizzata e il componente [Right] occupa la colonna [slot-right];
- righe 13–15: definiscono una riga [3] in cui la colonna [slot-right] non viene visualizzata e il componente [Left] occupa la colonna [slot-left];
- righe 17–19: definiscono una riga [4] in cui la colonna [slot-left] è visualizzata [:left=’true’] ma non riempita, e il componente [Right] occupa la colonna [slot-right];
In definitiva, il componente [Layout] ha fatto da layout per il componente [Content].