# Configuração
Esta seção usa a sintaxe de componente single file para exemplos de código.
Este guia assume que você já leu a Introdução à API de Composição e Fundamentos da Reatividade. Leia-os primeiro se você é novo em API de composição (Composition API).
# Argumentos
Ao usar a função setup, ela receberá dois argumentos:
propscontext
Vamos nos aprofundar em como cada argumento pode ser usado.
# props
O primeiro argumento da função setup é o argumento props. Assim como é de se esperar em um componente padrão, props dentro de uma função setup são reativos e serão atualizados quando novos props são passados.
// MyBook.vue
export default {
props: {
title: String
},
setup(props) {
console.log(props.title)
}
}
2
3
4
5
6
7
8
9
10
Atenção
No entanto, porque os props são reativos, você não pode usar a desestruturação de objetos do ES6 porque isso vai remover sua reatividade.
Se você precisa desestruturar seus props, você o pode fazer seguramente usando o toRefs dentro da função setup.
// MyBook.vue
import { toRefs } from 'vue'
setup(props) {
const { title } = toRefs(props)
console.log(title.value)
}
2
3
4
5
6
7
8
9
# context
O segundo argumento passado para a função setup é o context. O context é um objeto Javascript normal que expõe três propriedades do componente:
// MyBook.vue
export default {
setup(props, context) {
// Atributos (objeto não reativo)
console.log(context.attrs)
// Slots (objeto não reativo)
console.log(context.slots)
// Emissão de Eventos (método)
console.log(context.emit)
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
O objeto context é um objeto normal Javascript, ou seja, não é reativo, o que significa que você pode seguramente utilizar a desestruturação ES6 nele.
// MyBook.vue
export default {
setup(props, { attrs, slots, emit }) {
...
}
}
2
3
4
5
6
attrs e slots são objetos com estados que sempre são atualizados quando o componente é atualizado. Isso significa que você deve evitar desestruturá-los e sempre referenciar suas propriedades por meio de attrs.x ou slots.x. Note também que, diferente de props, attrs e slots não são reativos. Se você busca aplicar efeitos baseados em mudanças nos attrs ou slots, você deveria fazê-lo dentro do hook de ciclo de vida onUpdate.
# Acessando Propriedades de Componentes
Quando o setup é executado, a instância do componente ainda não foi criada. Como resultado, você somente poderá acessar as seguintes propriedades:
propsattrsslotsemit
Em outras palavras, você não terá acesso às seguintes opções de componentes:
datacomputedmethods
# Uso com Templates
Se setup retorna um objeto, as propriedades no objeto podem ser acessadas no template do componente, assim como as propriedades do props passadas para o setup:
<!-- MyBook.vue -->
<template>
<div>{{ collectionName }}: {{ readersNumber }} {{ book.title }}</div>
</template>
<script>
import { ref, reactive } from 'vue'
export default {
props: {
collectionName: String
},
setup(props) {
const readersNumber = ref(0)
const book = reactive({ title: 'Guia do Vue 3' })
// expor ao template
return {
readersNumber,
book
}
}
}
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Note que o refs que é retornado do setup é automaticamente desempacotado quando acessado no template, portanto você não deveria usar .value nos templates.
# Uso com Funções de Renderização
setup pode, inclusive, retornar uma função de renderização que pode diretamente fazer uso do estado reativo declarado no mesmo escopo:
// MyBook.vue
import { h, ref, reactive } from 'vue'
export default {
setup() {
const readersNumber = ref(0)
const book = reactive({ title: 'Guia do Vue 3' })
// Por favor, note que precisamos explicitamente expor o valor de ref aqui
return () => h('div', [readersNumber.value, book.title])
}
}
2
3
4
5
6
7
8
9
10
11
12
# Uso do this
Dentro de setup(), this não será uma referência à instância atualmente ativa. Já que setup() é chamado antes que as outras opções do componente sejam resolvidas, this dentro de setup() vai se comportar diferentemente do this de outras opções. Isso pode causar confusões ao se usar o setup() com outras API de Opções.