Pular para conteúdo

Aula 06 – Eventos e Comunicação entre Componentes 📡

Já sabemos como enviar dados para baixo (Pai → Filho) com Props. Mas e se o filho precisar avisar ao pai que um botão foi clicado ou um formulário foi preenchido? Usamos Events (Emits).


📤 Emitindo Eventos (Filho → Pai)

O componente filho "grita" um evento e o pai fica "ouvindo".

1. No Componente Filho (BotaoAcao.vue):

<template>
  <button @click="enviarClique">Clique aqui!</button>
</template>

<script setup>
// Declarando quais eventos este componente pode emitir
const emit = defineEmits(['clicouNoBotao'])

function enviarClique() {
  // Emitindo o evento com um dado opcional
  emit('clicouNoBotao', 'Dados enviados do filho')
}
</script>

2. No Componente Pai (App.vue):

<template>
  <!-- Ouvindo o evento com @ (assim como @click) -->
  <BotaoAcao @clicou-no-botao="tratarEvento" />

  <p>Mensagem recebida: {{ mensagem }}</p>
</template>

<script setup>
import { ref } from 'vue'
import BotaoAcao from './components/BotaoAcao.vue'

const mensagem = ref('')

function tratarEvento(payload) {
  mensagem.value = payload
}
</script>

📊 Fluxo de Comunicação

sequenceDiagram
    participant P as Pai (App.vue)
    participant F as Filho (BotaoAcao.vue)
    P->>F: Props (Dados)
    Note over F: Usuário interage
    F-->>P: Emit (Evento)

🔄 Comunicação entre Irmãos

Componentes "irmãos" não se comunicam diretamente. * Padrão: O irmão enviador emite para o pai, e o pai passa para o outro irmão via Prop. * Avançado: Veremos no futuro o uso de Stores (Pinia) para estado global.


🧠 Boas Práticas

Nomes de Eventos

Enquanto props usam camelCase no script e kebab-case no HTML, os eventos devem, por convenção, sempre usar kebab-case nos emits: emit('atualizar-lista').


💻 Mão na Massa

Crie um componente ItemTarefa.vue que tenha um botão para "Remover". Ao clicar, ele deve emitir um evento remover passando o ID da tarefa para o pai.


📝 Exercício

  1. Qual a diretiva usada no pai para "ouvir" um evento emitido pelo filho?
  2. Como passamos dados adicionais junto com um evento emitido?
  3. Explique por que componentes irmãos não se falam diretamente.

🚀 Próxima Aula: Vamos conhecer os momentos "mágicos" do Vue com o Ciclo de Vida!