Skip to content

Slots e Componentes Dinâmicos

O Vue.js oferece poderosos recursos de composição e renderização dinâmica, facilitando a construção de interfaces de usuário flexíveis e reutilizáveis. Usando slots e componentes dinâmicos, os desenvolvedores podem criar layouts complexos e adaptáveis com facilidade. Vamos explorar esses conceitos com exemplos.

Slots: Composição de Componentes

Slots no Vue.js permitem que você defina pontos de inserção de conteúdo em seus componentes. Isso torna os componentes mais reutilizáveis e flexíveis, pois você pode injetar conteúdo específico no template do componente pai.

Exemplo Básico de Slots:

Suponha que você tenha um componente de Card que pode aceitar conteúdo dinâmico:

vue
<!-- CardComponent.vue -->
<template>
  <div class="card">
    <header>
      <slot name="header"></slot>
    </header>
    <main>
      <slot></slot>
    </main>
    <footer>
      <slot name="footer"></slot>
    </footer>
  </div>
</template>

<style scoped>
.card {
  border: 1px solid #eee;
  border-radius: 8px;
  padding: 20px;
}
</style>

Você pode usar esse componente e passar conteúdo diferente para cada slot assim:

vue
<template>
  <CardComponent>
    <template v-slot:header>
      <h1>Header Content</h1>
    </template>
    <p>This is the main content of the card.</p>
    <template v-slot:footer>
      <button>Click Me</button>
    </template>
  </CardComponent>
</template>

Componentes Dinâmicos

Vue também permite renderizar componentes dinamicamente usando a tag especial <component> juntamente com a prop is. Isso é útil em situações onde você precisa alternar entre diferentes componentes em um local comum na UI, como uma área de conteúdo multifuncional.

Exemplo de Renderização Dinâmica:

Primeiro, defina alguns componentes simples:

vue
<!-- WelcomeComponent.vue -->
<template>
  <div>Welcome!</div>
</template>
vue
<!-- GoodbyeComponent.vue -->
<template>
  <div>Goodbye!</div>
</template>

Agora, use a tag <component> para alternar entre eles dinamicamente:

vue
<script setup lang="ts">
import type { Component } from "vue";
import { ref } from "vue";

import WelcomeComponent from "./WelcomeComponent.vue";
import GoodbyeComponent from "./GoodbyeComponent.vue";

const currentComponent = ref("WelcomeComponent");
const components: { [k: string]: Component } = {
  WelcomeComponent,
  GoodbyeComponent,
};
</script>

<template>
  <div>
    <select v-model="currentComponent">
      <option value="WelcomeComponent">Welcome</option>
      <option value="GoodbyeComponent">Goodbye</option>
    </select>
  </div>
  <div>
    <component :is="components[currentComponent]" />
  </div>
</template>

Considerações Finais:

  • Slots: Facilitam a criação de componentes altamente reutilizáveis e configuráveis, permitindo aos consumidores do componente personalizar parte do conteúdo do template.
  • Componentes Dinâmicos: Permitem alternar entre diferentes componentes em um único ponto de montagem, aumentando a flexibilidade e reduzindo a complexidade do código.

Combinando slots e componentes dinâmicos, os desenvolvedores podem criar aplicações Vue altamente adaptáveis e manuteníveis, que respondem bem às necessidades de negócios em constante mudança e experiências de usuário altamente personalizadas.