Skip to content
The translation is synced to the docs on of which the commit hash is e0f492e.

Componentes Funcionais
rutura

Visão Geral

Em termos do que mudou, num alto nível:

  • O desempenho ganho a partir da 2.x para os componentes funcionais agora são insignificantes na 3.x, então recomendamos apenas usar os componentes com estado.
  • Os componentes funcionais apenas podem ser criados usando uma função simples que recebe props e context (por exemplo, slots, attrs, emit).
  • RUTURA: o atributo functional no <template> do componente de ficheiro único foi removido
  • RUTURA: a opção { functional: true } nos componentes criados por funções foi removida

Para mais informação, continue a ler!

Introdução

Na Vue 2, os componentes funcionais tinham dois casos de uso primários:

  • como uma otimização de desempenho, porque inicializavam muito mais rápido do que os componentes com estado
  • para retornar vários nós de raiz

No entanto, na Vue 3, o desempenho dos componentes de estado melhorou ao ponto que a diferença é insignificante. Além disto, agora os componentes de estado também incluem a habilidade de retornar vários nós de raiz.

Como resultado, o único caso de uso restante para os componentes funcionais é para componentes simples, tais como um componente que cria um cabeçalho dinâmico. De outro modo, é recomendado usar os componentes de estado como normalmente faríamos.

Sintaxe da 2.x

Usar o componente <dynamic-heading>, que é responsável para desenhar o cabeçalho apropriado (por exemplo, h1, h2, h3, etc.), este poderia ter sido escrito como um componente de ficheiro único na 2.x como:

js
// Exemplo de Componente Funcional da Vue 2
export default {
  functional: true,
  props: ['level'],
  render(h, { props, data, children }) {
    return h(`h${props.level}`, data, children)
  }
}

Ou, para os que prefeririam o <template> num componente de ficheiro único:

vue
<!-- Exemplo de Componente Funcional da Vue 2 com <template> -->
<template functional>
  <component
    :is="`h${props.level}`"
    v-bind="attrs"
    v-on="listeners"
  />
</template>

<script>
export default {
  props: ['level']
}
</script>

Sintaxe da 3.x

Componentes Criados por Funções

Agora na Vue 3, todos os componentes funcionais são criados com uma função simples. Em outras palavras, não existe necessidade de definir a opção de componente { functional: true }.

Eles receberão dois argumentos: props e context. O argumento context é um objeto que contém as propriedades attrs, slots, e emit dum componente.

Além disto, ao invés de fornecer implicitamente h numa função render, h agora é importada globalmente.

Usando o exemplo mencionado anteriormente dum componente <dynamic-heading>, eis como se parece agora:

js
import { h } from 'vue'

const DynamicHeading = (props, context) => {
  return h(`h${props.level}`, context.attrs, context.slots)
}

DynamicHeading.props = ['level']

export default DynamicHeading

Componentes de Ficheiro Único

Na 3.x, a diferença de desempenho entre os componentes de estado e funcionais tem sido drasticamente reduzida e será insignificante na maioria dos casos de uso. COmo resultado, o caminho de migração para os programadores usando functional nos componentes de ficheiro único é remover o atributo e renomear todas as referências de props para $props e attrs para $attrs.

Usando o nosso exemplo <dynamic-heading> do exemplo de antes, eis como se pareceria agora:

vue
<template>
  <component
    v-bind:is="`h${$props.level}`"
    v-bind="$attrs"
  />
</template>

<script>
export default {
  props: ['level']
}
</script>

As principais diferenças são que:

  1. O atributo functional foi removido da <template>
  2. Os listeners agora são passados como parte de $attrs e podem ser removidas

Próximos Passos

Para mais informação sobre o uso dos novos componentes funcionais e mudanças para desenhar funções em geral, consulte: