Aparência
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.