Skip to content

8. projeto [vuejs-06]: layout de uma visualização com slots

Image

8.1. O script principal [main.js]

O script principal [main.js] permanece inalterado.

8.2. O componente principal [App]

O código do 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",
    // componentes utilizados
    components: {
      Content
    }
  };
</script>

O componente [App] introduz um novo componente chamado [Content] (linhas 7, 14, 19).

8.3. O componente [Layout]

O componente [Layout] serve para definir o layout das visualizações do aplicativo:


<template>
  <!-- linha -->
  <b-row>
    <!-- campo com três colunas -->
    <b-col cols="3" v-if="left">
      <slot name="slot-left" />
    </b-col>
    <!-- área com nove colunas -->
    <b-col cols="9" v-if="right">
      <slot name="slot-right" />
    </b-col>
  </b-row>
</template>

<script>
  export default {
    name: "patron",
    // parâmetros
    props: {
      left: {
        type: Boolean
      },
      right: {
        type: Boolean
      }
    }
  };
</script>

Comentários

  • o componente [Layout] define uma única linha (linhas 3-12). Esta é dividida em duas colunas:
    • uma coluna composta por 3 colunas do Bootstrap (linhas 5 a 7);
    • uma coluna composta por 9 colunas do Bootstrap (linhas 9 a 11);
  • linha 5: a presença da coluna da 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: não se define o conteúdo da coluna da esquerda. Simplesmente se atribui um nome a essa coluna com a tag <slot>. Aqui, ela se chamará [slot-left]. Um componente que utilize o componente [Content] deverá indicar o que deseja inserir na área denominada [slot-left];
  • linha 10: a coluna da direita se chamará [slot-right];

8.4. O componente [Right]

O componente [Right] é o seguinte:


<template>
  <!-- uma mensagem em um alerta do tipo “warning” -->
  <b-alert show variant="warning" align="center">
    <h4>{{msg}}</h4>
  </b-alert>
</template>

<!-- script -->
<script>
  export default {
    name: "droite",
    // parâmetros
    props: {
      msg: String
    }
  };
</script>
  • linhas 3-5: o componente [Right] exibe uma mensagem em um alerta do tipo [warning]. Essa mensagem [msg] está definida como um parâmetro do componente, linha 14. O componente pai deverá, portanto, atribuir-lhe um valor;

8.5. O componente [Left]

O componente [Left] é o seguinte:


<template>
  <!-- uma mensagem em um alerta do tipo “primary” -->
  <b-alert show variant="primary" align="center">
    <h4>{{msg}}</h4>
  </b-alert>
</template>

<!-- script -->
<script>
  export default {
    name: "gauche",
    // parâmetros
    props: {
      msg: String
    }
  };
</script>
  • linhas 3-5: o componente [Left] exibe uma mensagem em um alerta do tipo [primary]. Essa mensagem [msg] está definida como um parâmetro do componente, linha 14. O componente pai deverá, portanto, atribuir-lhe um valor;

8.6. O componente [Content]

Lembramos que o componente [Content] é o componente exibido pela visualização principal [App.vue]:


<template>
  <div>
    <!-- colunas esquerda e direita preenchidas -->
    <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>
    <!-- colunas esquerda vazia, coluna direita preenchida -->
    <Layout :left="false" :right="true">
      <Right slot="slot-right" msg="slot [slot-right] présent et rempli, slot [slot-left] absent" />
    </Layout>
    <!-- coluna esquerda preenchida, coluna direita ausente -->
    <Layout :left="true" :right="false">
      <Left slot="slot-left" msg="slot [slot-left] présent et rempli, slot [slot-right] absent" />
    </Layout>
    <!-- coluna esquerda presente, mas não preenchida; coluna direita preenchida -->
    <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",
    // componentes
    components: {
      Layout,
      Left,
      Right
    }
  };
</script>

Representação visual

Image

Comentários

  • o componente [Layout] é utilizado 4 vezes (linhas 4-7, 9-11, 13-15, 17-19). Se considerarmos que o componente [Layout] define uma linha, o [template] acima define quatro linhas. Lembramos também que a linha do [Layout] define duas colunas:
    • uma coluna chamada [slot-left], que ocupa as três colunas do Bootstrap à esquerda;
    • uma coluna chamada [slot-Right] que ocupa as 9 colunas do Bootstrap à direita;
  • linhas 4-7: define uma linha [1], na qual o componente [Left] ocupa a coluna [slot-left] e o componente [Right] ocupa a coluna [slot-right];
  • linhas 9-11: define uma linha [2], na qual a coluna [slot-left] não é exibida e o componente [Right] ocupa a coluna [slot-right];
  • linhas 13-15: define uma linha [3], na qual a coluna [slot-right] não é exibida e o componente [Left] ocupa a coluna [slot-left];
  • linhas 17-19: define uma linha [4], na qual a coluna [slot-left] é exibida como [:left=’true’], mas não preenchida, e o componente [Right] ocupa a coluna [slot-right];

No final, o componente [Layout] serviu de layout para o componente [Content].