- Aprenda
-
Ecossistema
Ajuda
Ferramentas
Bibliotecas Oficias
Notícias
Listas de Recursos
- Equipe
- Patrocine
- Traduções
Guia
Essenciais
- Instalação
- Introdução
- A Instância Vue
- Sintaxe de Templates
- Dados Computados e Observadores
- Interligações de Classe e Estilo
- Renderização Condicional
- Renderização de Listas
- Manipulação de Eventos
- Interligações em Formulários
- Básico sobre Componentes
Componentes em Detalhes
- Registro de Componentes
- Propriedades
- Eventos Personalizados
- Slots
- Dinâmicos & Assíncronos
- Lidando com Casos Extremos
Transições & Animações
- Transições de Visibilidade e Listas
- Transições de Estado
Reuso & Composição
- Mixins
- Diretivas Personalizadas
- Funções de Renderização & JSX
- Plugins
- Filtros
Ferramentas
- Publicando em Produção
- Componentes Single-File
- Testes Unitários
- Suporte ao TypeScript
Escalonando
- Roteamento
- Gerenciamento de Estado
- Renderizando no Lado do Servidor
Internamente
- Reatividade em Profundidade
Migração
- Migração do Vue 1.x
- Migração do Vue Router 0.7.x
- Migração do Vuex 0.6.x para 1.0
Diversos
- Comparação com Outros Frameworks
- Junte-se à Comunidade Vue.js!
- Conheça a Equipe
Slots
Nota da Equipe de Tradução
Este arquivo ainda não foi traduzido! Leia a versão original em inglês a seguir e, se puder, colabore com sua tradução: acesse nosso projeto no GitHub, avise que irá contribuir e inicie a tradução. Sua participação é muito importante!
Esta página assume que você já leu o Básico sobre Componentes. Leia lá primeiro se você for novo com componentes.
Na verão 2.6, Nós introduzimos uma nova sintaxe unificada (A diretiva
v-slot) para os slots nomeados e com escopo. Ele substitui os atributossloteslot-scope, o qual estão agora obsoletos, mas não foram removidos e ainda estão documentados aqui. Os fundamentos para a nova sintaxe estão descritos neste RFC.
Conteúdos Slot
Vue implementa uma API de distribuição de conteúdo que é modelada após a atual Detalhamento da especificação dos componentes da Web, usando o elemento <slot> para servir como saídas de distribuição de conteúdos
Isso permite que você componha componentes como esse:
<navigation-link url="/profile"> |
Então no template para <navigation-link>, você poderá ter:
<a |
Quando o componente renderizar, o elemento <slot> será substituido por “Seu Perfil”. Slots podem conter qualquer tipo de codigo template, incluindo HTML:
<navigation-link url="/profile"> |
Ou até mesmo outros componentes:
<navigation-link url="/profile"> |
Se no <navigation-link> NÃO contém elemento <slot>, qualquer conteúdo passado para ele simplesmente será descartado.
Escopo de compilação
Quando você quer usar um dado dentro de um slot, como em:
<navigation-link url="/profile"> |
Esse slot tem acesso as mesmas propriedades da instância (i.e. ao mesmo “escopo”) como o resto do template. O slot NÃO tem acesso ao escopo do <navigation-link>. Por exemplo, tentando acessar a url não funcionaria:
<navigation-link url="/profile"> |
Como regra, lembre-se de que:
Tudo no template pai é compilado no escopo do pai; Tudo no template filho é compilado no escopo do filho.
Conteúdo de Fallback
Há casos em que é útil especificar o conteúdo de falllback (i.e. padrão) para um slot, a ser renderizado somente quando nenhum conteúdo é fornecido. Por exemplo, no componente <submit-button>:
<button type="submit"> |
Podemos querer que o texto “Enviar” seja renderizado dentro do <button> na maioria das vezes. para “Enviar” o conteúdo de fallback, podemos colocá-lo entre as tags <slot>:
<button type="submit"> |
Agora, quando usamos <submit-button> no componente pai, sem fornecer conteúdo para o slot:
<submit-button></submit-button> |
Irá renderizar o conteúdo de fallback, “Enviar”:
<button type="submit"> |
Mas se nós fornecermos conteúdo:
<submit-button> |
Então, o conteúdo fornecido será renderizado:
<button type="submit"> |
Slots Nomeados
Atualizado em 2.6.0+. Veja aqui para a sintaxe obsoleta usando o atributo
slot.
Há momentos que é útil ter múltiplos elementos slots. Por exemplo, em um componente <base-layout> com o seguinte template:
<div class="container"> |
Para estes casos, o elemento <slot> em um atributo especial chamado, name, que pode ser usado para definir slots adicionais:
<div class="container"> |
Um <slot> sem name implica implicitamente como “default“.
Para fornecer conteúdo para slots nomeados, nos podemos usar a diretiva v-slot em um <template>, fornecendo o nome do slot como argumento do v-slot:
<base-layout> |
Agora tudo dentro dos elementos <template> serão passado aos slots correspondentes. Qualquer conteúdo não envolvido por um <template> usando v-slot é assumido como sendo o slot default.
No entanto, você ainda pode incluir o conteúdo do slot default em um <template> se você desejar deve ficar explícito:
<base-layout> |
De qualquer forma, O HTML renderizado será:
<div class="container"> |
Observe que v-slot só pode ser adicionado a um <template> (com única exceção), ao contrário dos atributos slot.
Scoped Slots
Atualizado em 2.6.0+. Veja aqui para a sintaxe obsoleta usando o atributo
slot-scope.
As vezes, é útil que o conteúdo do slot tenha acesso aos dados disponíveis apenas no componente filho. Por exemplo, imagine um componente <current-user> com o seguinte template:
<span> |
Podemos querer substituir esse conteúdo de fallback para exibir o primeiro nome do usuário, em vez do último, assim:
<current-user> |
Isso não funcionará, no entanto, porque somente o componente <current-user> tem acesso ao user e ao conteúdo que estamos fornecendo é renderizado no pai.
Para tornar user disponível para o conteúdo do slot no pai, podemos ligar user como um atributo do elemento <slot>:
<span> |
Atributos ligados a um elemento <slot> são chamados de slot props. Agora, no escopo pai, podemos usar o v-slot com um valor para definir um nome para o slot que nos foi fornecido:
<current-user> |
Neste exemplo, escolhemos nomear o objeto que contém todos os nossos slots props slotProps, mas você pode usar qualquer nome que desejar.
Sintaxe abreviada para slots default
Em casos como acima, quando apenas o slot default é fornecido, as tags do componente podem ser usadas como o template. Isso nos permite usar o v-slot diretamente no componente:
<current-user v-slot:default="slotProps"> |
Isso pode ser encurtado ainda mais. Assim como o conteúdo não especificado é considerado como sendo o slot default, assume-se que o v-slot sem um argumento se refira ao slot default:
<current-user v-slot="slotProps"> |
Observe que a sintax abreviada para o slot default NÃO PODE ser misturado com slots nomeados, pois isso levaria a ambiguidade do escopo:
<!-- INVALID, will result in warning --> |
Sempre que houver vários slots, use a sintaxe completa com base em <template> para todos os slots:
<current-user> |
Destructuring Slot Props
Internamente, os scoped slots trabalham envolvendo seu conteúdo de slot em uma função passada em um único argumento:
function (slotProps) { |
Isso significa que o valor de v-slot pode realmente aceitar qualquer expressão JavaScript válida que possa aparecer na posição de argumento de uma definição de função. Então, em ambientes suportados (single-file components ou browsers modernos), você também pode usar ES2015 destructuring to pull out specific slot props, assim:
<current-user v-slot="{ user }"> |
Isso pode tornar o template bem mais limpo, especialmente quando o slot fornece muitas props. Também abre outras possibilidades, tais como renomear props, e.g. user para person:
<current-user v-slot="{ user: person }"> |
Você pode até mesmo definir fallbacks, para serem usados no caso de um slot prop ser indefinido:
<current-user v-slot="{ user = { firstName: 'Guest' } }"> |
Slots de nomes dinâmicos
Novo na versão 2.6.0+
Diretiva de argumentos dinâmicos também funciona v-slot, permitindo a definição de slots nomeados dinâmicos:
<base-layout> |
Atalho para Slots Nomeados
Novo na versão 2.6.0+
Semelhante ao v-on e v-bind o v-slot também possui um atalho, substituindo tudo antes do argumento (v-slot:) pelo símbolo especial #. Por exemplo, v-slot:header pode ser reescrito como #header:
<base-layout> |
No entanto, assim como com outras diretivas, a abreviação só está disponível quando um argumento é fornecdo. Isso significa que a seguinte sintaxe é inválida:
<!-- Isso acionará um aviso --> |
Em vez disso, você sempre deve especificar um nome para o slot se desejar usar o atalho:
<current-user #default="{ user }"> |
Outros exemplos
Slot props nos permite transformar slots em templates reutilizáveis que podem renderizar diferentes conteúdos com base em adições de entrada. Isso é mais útil quando você está projetando um componente reutilizável que encapsula a lógica de dados, enquanto permite que o componente pai consumidor personalize parte de seu layout.
Por exemplo, estamos implementando um componente<todo-list> que contém o layout e a lógica de filtragem para uma lista:
<ul> |
Em vez de codificar o conteúdo para cada todo, podemos deixar que o componente pai assuma o controle fazendo de todos todo um slot, então ligando todo como uma slot prop:
<ul> |
Agora, quando usamos o componente <todo-list>, podemos opcionalmente definir uma alternativa <template> para itens do todo, mas com acesso aos dados do filho:
<todo-list v-bind:todos="todos"> |
Contudo, mesmo que tratado superficialmente dos quais scoped slots são capazes de fazer. Para exemplos completos e reais de uso, recomendamos buscar mais sobre bibliotecas como Vue Virtual Scroller, Vue Promised, e Portal Vue.
Sintaxe Obsoleta
A diretiva
v-slotfoi introduzida no Vue 2.6, oferecendo uma API melhorada e alternativa aos atributossloteslot-scopeainda suportados. O raciocínio completo para introduzir ov-sloté descrito neste RFC. Os atributossloteslot-scopecontinuarão a ser suportados em todas as futuras versões 2.X, mas serão oficialmente descontinuados e serão eventualmente removidos no Vue 3.
Slots Nomeados com o atributo slot
Obsoleta no 2.6.0+. Veja aqui a nova e recomendada sintaxe.
Para passar conteúdos para os slots nomeados a partir do pai, use o atributo especial slot no <template> (usando o componente <base-layout> descrito aqui como exemplo):
<base-layout> |
Ou o atributo slot que também pode ser usado diretamente em um elemento normal:
<base-layout> |
Ainda pode haver um slot sem nome, que é o default slot que serve como um agrupador para qualquer conteúdo que não tenha o nome combinado. Em ambos exemplos acima, o HTML renderizado seria:
<div class="container"> |
Scoped Slots com o atributo slot-scope
Obsoleta no 2.6.0+. Veja aqui a nova e recomendada sintaxe.
Para receber as props passadas para um slot, o componente pai pode usar o <template> com o atributo slot-scope ( usando o <slot-exemplo> descrito no exemplo aqui):
<slot-example> |
Aqui, o slot-scope declara o objeto props recebido como a variável slotProps, e o torna disponível dentro do escopo do <template>. Você pode nomear o slotProps da maneira que preferir, semelhante a argumentos de funções em JavaScript.
Aqui slot=default pode ser omitido como está implícito:
<slot-example> |
O atributo slot-scope pode também ser usado diretamente em elementos que não seja <template> (incluindo componentes):
<slot-example> |
O valor de slot-scope pode aceitar qualquer expressão JavaScript válida que pode aparecer na posição de argumento de uma definição de função. Isso significa em ambientes suportados (single-file components ou browsers modernos) você também pode usar ES2015 destructuring na expressão, da seguinte forma:
<slot-example> |
Usando o <todo-list> descrito aqui como no exemplo, aqui está o uso equivalente usando slot-scope:
<todo-list v-bind:todos="todos"> |