Na Composition API, o setup() recebe dois argumentos: props e context.


🧩 1. Recebendo Props no setup()

O primeiro argumento do setup() são as props recebidas pelo componente.

export default {
  props: {
    titulo: String
  },
  setup(props) {
    console.log(props.titulo) // Acessa a prop 'titulo'
    return {}
  }
}

As props são reativas! Mas não podem ser diretamente modificadas (são somente leitura).


💡 Exemplo com props:

export default {
  props: {
    nome: String
  },
  setup(props) {
    const saudacao = `Olá, ${props.nome}!`
    return { saudacao }
  }
}

🧩 2. Usando o Contexto

O segundo argumento é um objeto chamado context, que contém:

Propriedade Descrição
attrs Atributos passados ao componente que não são declarados como props como class ou id
slots Slots passados ao componente
emit Função para emitir eventos personalizados

🔍 Exemplo:

export default {
  props: ['nome'],
  setup(props, context) {
    console.log(context.attrs)   // { id: 'meu-componente' } (se não for uma prop)
    console.log(context.slots)   // Acesso aos slots
    context.emit('clicado')      // Emite evento
    return {}
  }
}

📤 Emitindo eventos com emit

Você pode emitir eventos personalizados usando context.emit.

export default {
  setup(props, { emit }) {
    const clicar = () => {
      emit('meu-evento')
    }

    return { clicar }
  }
}

E no template:

@meu-evento="fazerAlgo" />

📝 Resumo Rápido

Item Forma de Acesso Observações
Props setup(props) Reativas e somente leitura
Atributos extras context.attrs Não declarados em props
Slots context.slots Acessa conteúdo dos slots
Emitir evento context.emit() Dispara eventos para o componente pai

📌 Dica: Você pode desestruturar o segundo argumento:

setup(props, { emit, attrs, slots })


-> Adicional

🔄 Uso combinado de attrs e slots

<template>
   :class="attrs.class">
    
  
template>

<script>
export default {
  setup(props, { attrs }) {
    return { attrs }
  }
}
script>
class="minha-classe">
  Conteúdo dinâmico aqui!