8. projeto [vuejs-06]: definindo o layout de uma vista com slots

8.1. O script principal [main.js]
O script principal [main.js] permanece inalterado.
8.2. O componente principal [App]
O código para o componente [App] é o seguinte:
<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>
O componente [App] introduz um novo componente chamado [Content] (linhas 7, 14, 19).
8.3. O componente [Layout]
O componente [Layout] é utilizado para definir o layout das vistas da aplicação:
<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>
Comentários
- O componente [Layout] define uma única linha (linhas 3–12). Esta linha está dividida em duas colunas:
- uma coluna composta por 3 colunas Bootstrap (linhas 5–7);
- uma coluna composta por 9 colunas Bootstrap (linhas 9–11);
- linha 5: a presença da coluna esquerda (linhas 5–7) depende do valor do parâmetro [left], definido na propriedade [props] do componente (linhas 20–22);
- linha 9: a presença da coluna direita (linhas 9–11) depende do valor do parâmetro [right], definido na propriedade [props] do componente (linhas 23–25);
- os valores dos parâmetros [left, right] devem ser definidos por um componente pai do componente [Layout];
- linha 6: o conteúdo da coluna esquerda não está especificado. Simplesmente atribuímos um nome a esta coluna utilizando a tag <slot>. Aqui, será chamada [slot-left]. Um componente que utilize o componente [Content] deve especificar o que pretende colocar na área chamada [slot-left];
- linha 10: a coluna direita será chamada [slot-right];
8.4. O componente [Right]
O componente [Right] é o seguinte:
<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>
- linhas 3–5: O componente [Right] exibe uma mensagem num alerta [warning]. Esta mensagem [msg] é definida como um parâmetro do componente na linha 14. O componente pai deve, portanto, fornecer-lhe um valor;
8.5. O componente [Left]
O componente [Left] é o seguinte:
<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>
- linhas 3–5: O componente [Left] exibe uma mensagem num alerta [primary]. Esta mensagem [msg] é definida como um parâmetro do componente na linha 14. O componente pai deve, portanto, fornecer-lhe um valor;
8.6. O componente [Content]
Recorde-se que o componente [Content] é o componente apresentado pela vista principal [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>
Representação visual

Comentários
- O componente [Layout] é utilizado 4 vezes (linhas 4–7, 9–11, 13–15, 17–19). Uma vez que o componente [Layout] define 1 linha, o [template] acima define quatro linhas. Além disso, a linha [Layout] define duas colunas:
- uma coluna chamada [slot-left] que ocupa as 3 colunas da esquerda do Bootstrap;
- uma coluna chamada [slot-right] que ocupa as 9 colunas da direita do Bootstrap;
- Linhas 4–7: define uma [1] linha onde o componente [Left] ocupa a coluna [slot-left] e o componente [Right] ocupa a coluna [slot-right];
- linhas 9–11: define uma linha [2] onde a coluna [slot-left] não é exibida e o componente [Right] ocupa a coluna [slot-right];
- linhas 13–15: define uma linha [3] onde a coluna [slot-right] não é exibida e o componente [Left] ocupa a coluna [slot-left];
- linhas 17–19: define uma linha [4] onde a coluna [slot-left] é exibida [:left=’true’] mas não preenchida, e o componente [Right] ocupa a coluna [slot-right];
Em última análise, o componente [Layout] serviu de layout para o componente [Content].