# Componentes Funcionais
breaking
# Visão Geral
Sobre o que mudou, em visão geral:
- O ganho de performance com componentes funcionais na v2.x, se tornou insignificante na v3.x, então recomendamos o uso normal de componentes com estado
- Componentes Funcionais só podem ser criados com uma função simples que recebe
props
econtext
(i.e.,slots
,attrs
,emit
) - BREAKING: O atributo
functional
na tag<template>
em componentes single-file (SFC) foi removido - BREAKING: A opção
{ functional: true }
em componentes criados por funções foi removida
Para mais informações, continue lendo!
# Introdução
No Vue 2, componentes funcionais tinham dois casos de uso primários:
- Como otimização de performance, pois inicializavam muito mais rápido que componentes com estado
- Para retornar múltiplos nós raiz (root nodes)
Porém, no Vue 3, a performance de componentes com estado melhorou, a ponto de a diferença ser insignificante. Além disso, componentes com estado agora também incluem a possibilidade de retornar multiplos nós raiz (root nodes).
Como resultado, o único caso de uso restante para componentes funcionais é um componente simples, como um componente para um cabeçalho dinâmico. Caso contrário, é recomendável usar componentes com estado, como você normalmente faria.
# Sintaxe v2.x
Considerando o componente <dynamic-heading>
, que é responsável por renderizar o cabeçalho apropriado (i.e., h1
, h2
, h3
, etc.), poderia ser escrito como um componente single-file na v2.x da seguinte forma:
// Exemplo de Componente Funcional no Vue 2
export default {
functional: true,
props: ['level'],
render(h, { props, data, children }) {
return h(`h${props.level}`, data, children)
}
}
2
3
4
5
6
7
8
Ou, para aqueles que preferem a tag <template>
em um componente single-file:
<!-- Exemplo de Componente Funcional com tag <template> no Vue 2 -->
<template functional>
<component
:is="`h${props.level}`"
v-bind="attrs"
v-on="listeners"
/>
</template>
<script>
export default {
props: ['level']
}
</script>
2
3
4
5
6
7
8
9
10
11
12
13
14
# Sintaxe v3.x
# Componentes Criados por Funções
Agora no Vue 3, todos os componentes funcionais são criados com uma função simples. Em outras palavras, não há mais a necessidade de definir a opção { functional: true }
no componente.
As funções receberão dois argumentos: props
e context
. O argumento context
é um objeto que contém as propriedados attrs
, slots
, e emit
de um componente.
Além disso, ao invés de fornecer implicitamente o argumento h
em uma função render
, h
agora é importado globalmente.
Usando o exemplo mencionado anteriormente de um componente <dynamic-heading>
, aqui está como ficou agora:
import { h } from 'vue'
const DynamicHeading = (props, context) => {
return h(`h${props.level}`, context.attrs, context.slots)
}
DynamicHeading.props = ['level']
export default DynamicHeading
2
3
4
5
6
7
8
9
# Componentes Single-File (SFCs)
Na v3.x, a diferença de performance entre componentes funcionais e de estado foi reduzida drasticamente, e será insignificante na maioria dos casos. Como resultado, o caminho de migração para desenvolvedores usando o atributo functional
em componentes single-page é remover o atributo e renomear as referências de props
para $props
e attrs
para $attrs
.
Usando o exemplo <dynamic-heading>
de antes, aqui está como ficaria agora:
<template>
<component
v-bind:is="`h${$props.level}`"
v-bind="$attrs"
/>
</template>
<script>
export default {
props: ['level']
}
</script>
2
3
4
5
6
7
8
9
10
11
12
As principais diferenças são:
- Atributo
functional
removido da tag<template>
listeners
agora são passados como parte de$attrs
e pode ser removido
# Próximos Passos
Para mais informação sobre o uso dos novos componentes funcionais e as mudanças nas funções de renderização em geral, acesse:
← Fragmentos API Global →