Componentes
Componentes Astro são parte fundamental de qualquer projeto Astro. São componentes de template com apenas HTML e sem execução no lado do cliente. Você pode localizar um componente Astro por sua extensão de arquivo: .astro
.
Componentes Astro são extremamente flexíveis. Geralmente, um componente Astro irá conter alguma UI reutilizável na página, como um cabeçalho ou um cartão de perfil. Outras vezes, um componente Astro pode conter um pedaço menor de HTML, como uma coleção de tags <meta>
comuns que facilitam trabalhar com SEO. Componentes Astro podem até mesmo conter o layout inteiro de uma página.
A coisa mais importante de entender sobre componentes Astro é que eles não renderizam no lado do cliente. Eles renderizam para HTML em tempo de build ou sob demanda usando renderização no lado do servidor (SSR). Você pode incluir código JavaScript dentro do frontmatter do seu componente, e todo esse código vai ser removido da página final enviada para o navegador dos seus usuários. O resultado é um site mais rápido, sem nenhum JavaScript adicionado por padrão.
Quando seu componente Astro realmente precisar de interatividade no lado do cliente, você pode adicionar tags <script>
tradicionais do HTML ou componentes de um Framework de UI.
Estrutura do Componente
Seção intitulada Estrutura do ComponenteUm componente Astro é feito de duas partes principais: o Script do Componente e o Template do Componente. Cada parte executa um trabalho diferente, porém juntos eles fornecem um framework que é ao mesmo tempo fácil de utilizar e expressivo o bastante para lidar com o que quer que seja que você deseja construir.
O Script do Componente
Seção intitulada O Script do ComponenteAstro utiliza uma cerca de código (---
) para identificar o script do seu componente Astro. Se você já escreveu Markdown antes, você já deve estar familiar com um conceito similar chamado de frontmatter. A ideia do Astro de um script do componente foi diretamente inspirado por este conceito.
Você pode utilizar o script do componente para escrever qualquer código JavaScript necessário para renderizar o seu template. Isso pode incluir:
- importar outros componentes Astro
- importar componentes de outros frameworks, como React
- importar dados, como um arquivo JSON
- buscar conteúdo de uma API ou banco de dados
- criar variáveis que você vai referenciar no seu template
A cerca de código é projetada para garantir que o JavaScript que você escreve nela está “cercado”. Ele não irá escapar para a sua aplicação frontend ou cair nas mãos dos seus usuários. Você pode com segurança escrever aqui código que é custoso ou sensível (como uma chamada ao seu banco de dados privado) sem se preocupar com ele indo parar no navegador do seu usuário em algum momento.
Você pode até mesmo escrever TypeScript no script do componente!
O Template do Componente
Seção intitulada O Template do ComponenteO template do componente está abaixo da cerca do código e determina o HTML que será produzido pelo seu componente.
Se você escrever HTML puro aqui, o seu componente irá renderizar esse HTML em qualquer página Astro em que ele é importado e utilizado.
Porém, a sintaxe do template do componente Astro também suporta expressões JavaScript, tags <style>
e <script>
do Astro, componentes importados, e diretivas especiais do Astro. Dados e valores definidos no script do componente podem ser utilizados no template do componente para produzir HTML criado dinamicamente.
Design baseado em componente
Seção intitulada Design baseado em componenteComponentes são projetados para serem reutilizáveis e combináveis. Você pode utilizar componentes dentro de outros componentes para criar UIs cada vez mais avançadas. Por exemplo, um componente Botao
pode ser utilizado para criar um componente GrupoBotoes
:
Props do Componente
Seção intitulada Props do ComponenteUm componente Astro pode definir e aceitar props. Essas props então se tornam disponíveis ao template do componente para renderizar HTML. Props estão disponíveis na global Astro.props
no script do frontmatter.
Aqui está um exemplo de um componente que recebe uma prop saudacao
e uma prop nome
. Note que as props a serem recebidas são desconstruídas a partir do objeto global Astro.props
.
Este componente, quando importado e renderizado em outros componentes Astro, layouts ou páginas, pode passar essas props como atributos:
Você também pode definir suas props com TypeScript através de uma interface de tipo Props
. Astro vai automaticamente pegar qualquer interface Props
definida no frontmatter e dar avisos/erros de tipagem para o seu projeto. Estas props também podem definir valores padrão quando desconstruídas de Astro.props
.
Props do componente podem receber valores padrões para serem utilizados quando nenhum é fornecido.
O elemento <slot />
é um placeholder para conteúdo HTML externo, permitindo que você injete elementos filhos de outros arquivos no template do seu componente.
Por padrão, todos os elementos filhos passados para o componente serão renderizados em seu <slot />
.
Diferente de props, que são atributos passados para um componente Astro, disponível para uso dentro de si com Astro.props()
, slots renderizam elementos filhos HTML onde eles estão escritos.
Este padrão é a base de um componente de layout Astro: uma página inteira de conteúdo HTML pode ser “envolta” com tags <AlgumComponenteDeLayout></AlgumComponenteDeLayout>
e enviadas até o componente para serem renderizadas dentro de elementos comuns da página definidos nele.
Slots Nomeados
Seção intitulada Slots NomeadosUm componente Astro também pode ter slots nomeados. Isto permite que você passe apenas elementos HTML com o nome de slot correspondente para a localização do slot.
Slots são nomeados usando o atributo name
:
Para injetar conteúdo HTML dentro de um slot em particular, use o atributo slot
em qualquer elemento filho para especificar o nome do slot. Todos os outros elementos filhos do componentes serão injetados no <slot />
padrão (não nomeado).
Use um atributo slot="meu-slot"
no elemento filho que você quer passar para um placeholder <slot name="meu-slot"/>
correspondente no seu componente.
Para passar múltiplos elementos HTML para um placeholder <slot/>
de um componente sem ter uma <div>
envolta, use o atributo slot=""
no Componente <Fragment/>
do Astro:
Injete múltiplas linhas e colunas de conteúdo HTML usando o atributo slot=""
para especificar o conteúdo do "cabecalho"
e "corpo"
. Elementos inviduais do HTML também podem ser estilizados:
Note que slots nomeados precisam ser um filho imediato do componente. Você não pode passar slots nomeados através de elementos aninhados.
Slots nomeados também podem ser passados para componentes de frameworks de UI!
Não é possível gerar dinamicamente o nome de um slot no Astro, como por exemplo dentro de uma função map. Se essa funcionalidade é necessária dentro de um componente de um framework de UI, o melhor é gerar esses slots dinâmicos dentro do próprio framework.
Conteúdo de Fallback para Slots
Seção intitulada Conteúdo de Fallback para SlotsSlots também podem renderizar conteúdo de fallback. Quando não existirem filhos correspondentes passados a um slot, um elemento <slot />
irá renderizar os elementos filhos que ele possui como placeholder.
Conteúdo de fallback será mostrado somente quando não houver elementos correspondentes com o atributo slot=“nome” sendo passados para dentro de um slot nomeado.
Astro vai passar um slot vazio quando um elemento de slot existir, mas não tiver nenhum conteúdo para passar. Conteúdo de fallback não pode ser utilizado como um padrão no caso de um slot vazio ser passado. Conteúdo de fallback só é exibido quando nenhum elemento de slot é encontrado.
Transferindo slots
Seção intitulada Transferindo slotsSlots podem ser transferidos para outros componentes. Por exemplo, quando criando layouts aninhados:
Slots nomeados podem ser transferidos para outro componente usando ambos os atributos name
e slot
em uma tag <slot />
Agora, os slots padrão e cabecalho
passados para LayoutInicio
vão ser transferidos para o pai LayoutBase
Componentes HTML
Seção intitulada Componentes HTMLAstro suporta a importação e uso de arquivos .html
como componentes ou colocando esses arquivos no subdiretório src/pages/
como páginas. Você pode querer utilizar componentes HTML se você estiver reutilizando código de um site já construído sem um framework ou se você quer se certificar de que seu componente não tem funcionalidades dinâmicas.
Componentes HTML devem conter apenas HTML válido, e portanto não tem as funcionalidades principais de componentes Astro:
- Eles não suportam frontmatter, importações no lado do servidor ou expressões dinâmicas.
- Quaisquer tags
<script>
deixam de fazer parte do bundle, sendo tratadas como se tivessemis:inline
. - Eles podem apenas referenciar assets que estão no diretório
public/
.
Um elemento <slot />
dentro de um componente HTML irá funcionar assim como funcionaria em um componente Astro. Para utilizar o Componente Web HTML Slot no lugar, adicione is:inline
ao seu elemento <slot>
.