Layouts
Layouts são componentes Astro usados para fornecer uma estrutura de UI reutilizável, como um template de página.
Nós convenientemente utilizamos o termo “layout” para componentes Astro que fornecem elementos comuns de UI compartilhados entre páginas como cabeçalhos, barras de navegação e rodapés. Um típico componente de layout Astro fornece páginas Astro, Markdown ou MDX com:
- uma casco da página (tags
<html>
,<head>
e<body>
) - um
<slot />
para especificar onde o conteúdo individual da página deve ser injetado.
Porém, não há nada de especial sobre um componente de layout! Eles podem receber props e importar e utilizar outros componentes como qualquer outro componente Astro. Eles podem incluir componentes de frameworks de UI e scripts no lado do cliente. Eles nem precisam fornecer uma casco completo da página, e podem ser utilizados como templates parciais de UI ao invés disso.
Componentes de layout são comumente inseridos em um diretório src/layouts
no seu projeto por organização, mas isso não é uma obrigação; você pode escolher colocar eles em qualquer lugar em seu projeto. Você pode até colocar componentes de layout juntamente das suas páginas prefixando os nomes dos layouts com _
.
Layout de Exemplo
📚 Aprenda mais sobre slots.
Layouts Markdown/MDX
Layouts de páginas são especialmente úteis para páginas Markdown e MDX que caso contrário não teriam nenhuma formatação.
Astro fornece a propriedade frontmatter especial layout
para especificar qual componente .astro
deve ser utilizado como o layout da página.
Um layout típico para páginas Markdown ou MDX inclui:
- A prop
frontmatter
para acessar o frontmatter da página Markdown ou MDX e outros dados. - Um slot
<slot />
padrão para indicar onde o conteúdo da página Markdown/MDX deve ser renderizado.
Você pode definir o tipo Props
de um layout com os tipos utilitários MarkdownLayoutProps
ou MDXLayoutProps
:
Props de Layout Markdown
Um layout Markdown/MDX terá acesso as seguintes informações pelo Astro.props
:
file
- O caminho absoluto deste arquivo (e.x./home/usuario/projetos/.../arquivo.md
).url
- Se for uma página, a URL da página (e.x./pt-br/guides/markdown-content
).frontmatter
- todo o frontmatter do documento Markdown ou MDX.frontmatter.file
- O mesmo que a propriedade superiorfile
.frontmatter.url
- O mesmo que a propriedade superiorurl
.
headings
- Uma lista dos títulos (h1 -> h6
) no documento Markdown ou MDX com os metadados associados. Esta lista segue o tipo:{ depth: number; slug: string; text: string }[]
.- (Apenas Markdown)
rawContent()
- Uma função que retorna o documento Markdown bruto como uma string. - (Apenas Markdown)
compiledContent()
- Uma função que retorna o documento Markdown compilado como uma string de HTML.
Uma postagem de blog Markdown de exemplo pode passar o seguinte objeto Astro.props
para seu layout:
Um layout Markdown/MDX terá acesso a todas as propriedades exportadas do arquivo pelo Astro.props
com algumas diferenças principais:
-
Informação de título (ou seja, elementos
h1 -> h6
) está disponível a partir do arrayheadings
, ao invés de pela funçãogetHeadings()
. -
file
eurl
também estão disponíveis como propriedades aninhadas defrontmatter
(ou seja,frontmatter.url
efrontmatter.file
). -
Valores definidos fora do frontmatter (e.x. declarações de
export
no MDX) não estão disponíveis. Considere importar um layout no lugar.
Importando Layouts Manualmente (MDX)
Você pode precisar passar informação para o seu layout MDX que não existe (ou não pode existir) no seu frontmatter. Neste caso, você pode importar e utilizar um componente <Layout />
no lugar e passar props a ele como qualquer outro componente:
Agora, seus valores estão disponíveis través do Astro.props
em seu layout, e seu conteúdo MDX será injetado na página onde o <slot />
do componente está escrito:
📚 Aprenda mais sobre o suporte para Markdown e MDDX do Astro em nosso guia de Markdown/MDX.
Usando um Layout para .md
, .mdx
e .astro
Um único layout Astro pode ser escrito para receber o objeto frontmatter
de arquivos .md
e .mdx
, assim como quaisquer props nomeadas passadas por arquivos .astro
.
No exemplo abaixo, o layout irá mostrar o título da página seja pela propriedade title
do frontmatter YAML ou por um componente Astro passando o atributo titulo
:
Aninhando Layouts
Componentes de layout não precisam conter uma página inteira de HTML. Você pode separar seus layouts em pequenos componentes e então, combinar componentes de layout para criar templates de páginas ainda mais flexíveis. Esse padrão é útil quando você quer compartilhar algum código através de múltiplos layouts.
Por exemplo, um componente de layout LayoutPostagemBlog.astro
pode estilizar um título de uma postagem, data e autor. Então, um LayoutBase.astro
de todo o site poderia lidar com o resto do template da sua página, como navegação, rodapés, meta tags SEO, estilos globais e fontes. Você também pode passar props recebidas da sua postagem para outro layout, assim como em qualquer outro componente aninhado.