Opções: Composição
provide
Fornece valores que podem ser injetados pelos componentes descendentes.
Tipo
tsinterface ComponentOptions { provide?: object | ((this: ComponentPublicInstance) => object) }
Detalhes
provide
einject
são usadas ao mesmo tempo para permitir um componente ancestral servir como um injetor de dependência para todos os seus descendentes, independentemente de quão profunda é a hierarquia do componente, enquanto estiverem na mesma cadeia primaria.A opção
provide
deve ser ou um objeto ou uma função que retorna um objeto. Este objeto contém as propriedades que estão disponíveis para a injeção para os seus descendentes. Nós podemos usar símbolos como chaves neste objeto.Exemplo
Uso básico:
jsconst s = Symbol() export default { provide: { foo: 'foo', [s]: 'bar' } }
Usando uma função para fornecer o estado por componente:
jsexport default { data() { return { msg: 'foo' } } provide() { return { msg: this.msg } } }
Nota que no exemplo acima, a
msg
fornecida NÃO será reativa. Consulte Trabalhando com a Reatividade por mais detalhes.Consulte também Fornecer ou Injetar
inject
Declara as propriedades a injetar no componente atual localizando-as a partir dos fornecedores ancestrais.
Tipo
tsinterface ComponentOptions { inject?: ArrayInjectOptions | ObjectInjectOptions } type ArrayInjectOptions = string[] type ObjectInjectOptions = { [key: string | symbol]: | string | symbol | { from?: string | symbol; default?: any } }
Detalhes
A opção
inject
deve ser:- Um vetor de sequências de caracteres, ou
- Um objeto onde as chaves são o nome de vínculo local e o valor é ou:
- A chave (sequência de caracteres ou símbolo) à procurar nas injeções disponíveis, ou
- Um objeto onde:
- A propriedade
from
é a chave (sequência de caracteres ou símbolo) à procurar nas injeções disponíveis, e - A propriedade
default
é usada como valor de retrocesso. Semelhante aos valores padrão das propriedades, uma função de fábrica é necessária para os tipos de objeto para impedir a partilha de valor entre várias instância do componente.
- A propriedade
Uma propriedade injetada será
undefined
se nenhuma propriedade correspondente e nem um valor padrão foi fornecido.Nota que os vínculos injetados NÃO são reativos. Isto é intencional. No entanto, se o valor injetado for um objeto reativo, as propriedades deste objeto permanecem reativas. Consulte Trabalhando com a Reatividade por mais detalhes.
Exemplo
Uso básico:
jsexport default { inject: ['foo'], created() { console.log(this.foo) } }
Usando um valor injetado como padrão para uma propriedade:
jsconst Child = { inject: ['foo'], props: { bar: { default() { return this.foo } } } }
Usando um valor injetado como entrada de dados:
jsconst Child = { inject: ['foo'], data() { return { bar: this.foo } } }
As injeções podem ser opcionais com valor padrão:
jsconst Child = { inject: { foo: { default: 'foo' } } }
Se precisar ser injetado a partir duma propriedade com um nome diferente, use
from
para denotar a propriedade da fonte:jsconst Child = { inject: { foo: { from: 'bar', default: 'foo' } } }
Semelhante aos padrões de propriedade, precisamos usar uma função de fábrica para os valores não primitivos:
jsconst Child = { inject: { foo: { from: 'bar', default: () => [1, 2, 3] } } }
Consulte também Fornecer ou Injetar
mixins
Uma vetor de objetos opcionais a serem misturados no componente atual.
Tipo
tsinterface ComponentOptions { mixins?: ComponentOptions[] }
Detalhes
A opção
mixins
aceita um vetor de objetos de mistura. Estes objetos de mistura podem conter opções de instância como objetos de instância normais, e serão combinadas contra as opções eventuais usando a lógica de combinação de opção certa. Por exemplo, se a nossa mistura contiver um gatilhoupdated
e o próprio componente também tiver um, ambas funções serão chamadas.Os gatilhos da mistura são chamados na ordem que são fornecidos, e chamados bem antes dos gatilhos do próprio componente.
NÃO É MAIS RECOMENDADO
Na Vue 2, as misturas eram o mecanismo primário para criação de pedaços reutilizáveis da lógica do componente. Embora as misturas continuam a ser suportadas na Vue 3, as Funções de Composição usando a API de Composição agora são a abordagem preferida para reutilização de código entre os componentes.
Exemplo
jsconst mixin = { created() { console.log(1) } } createApp({ created() { console.log(2) }, mixins: [mixin] }) // => 1 // => 2
extends
Um componente de "classe de base" a partir do qual estender.
Type:
tsinterface ComponentOptions { extends?: ComponentOptions }
Detalhes
Permite que um componente estenda outro, herdando suas opções de componente.
A partir duma perspetiva de implementação,
extends
é quase idêntico àmixins
. O componente especificado pelaextends
será tratado como se fosse a primeira mistura.No entanto,
extends
emixins
expressam diferentes intenções. A opçãomixins
é primariamente usada para compor pedaços de funcionalidade, ao passo queextends
está primariamente preocupada com a herança.Tal como acontece com a
mixins
, quaisquer opções (exceto parasetup()
) serão combinadas usando a estratégia de combinação relevante.Exemplo
jsconst CompA = { ... } const CompB = { extends: CompA, ... }
NÃO RECOMENDADA PARA API DE COMPOSIÇÃO
extends
está desenhada para a API de Opções e não lida com a combinação do gatilhosetup()
.Na API de Composição, o modelo mental preferido para reutilização da lógica é "composição" acima da "herança". Se tivermos lógica dum componente que precisa ser reutilizada num outro, consideramos extrair a lógica relevante para uma Função de Composição.
Se ainda tencionamos "estender" um componente usando a API de Composição, podemos chamar a
setup()
do componente de base nasetup()
do componente que se estende:jsimport Base from './Base.js' export default { extends: Base, setup(props, ctx) { return { ...Base.setup(props, ctx), // vínculos locais } } }