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
Seção intitulada Layout de ExemploLayouts Markdown
Seção intitulada Layouts MarkdownLayouts 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
Seção intitulada Props de Layout MarkdownUm 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)
Seção intitulada 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:
Usando um Layout para .md
, .mdx
e .astro
Seção intitulada Usando um Layout para .md, .mdx e .astroUm ú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
Seção intitulada Aninhando LayoutsComponentes 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.