Plantillas
Las plantillas son componentes de Astro para proporcionar una estructura reutilizable, como una plantilla de página.
Convencionalmente usamos el término “plantilla” para proporcional elementos compartidos en la interfaz del usuario por medio de páginas, como encabezados, barras de navegación y pies de página. Una plantilla proporciona a Astro, Markdown o páginas MDX con:
- una página shell (con estiquetas
<html>
,<head>
y<body>
) - un
<slot/>
para especificar dónde colocar el contenido de la página.
Pero, ¡no hay nada especial acerca de los componentes plantilla! Pueden aceptar props e importar y usar otros componentes como cualquier otro componente de Astro. Pueden incluir componentes de framework y scripts de lado del cliente. Ni siquiera tienen que proporcionar un plantilla entera, en su lugar se pueden utilizar como plantillas parciales.
Sin embargo, si un componente de plantilla contiene una página shell, su elemento <html>
debe ser el padre de todos los demás elementos en el componente. Todos los elementos <style>
o <script>
deben estar encerrados por las etiquetas <html>
.
Los componentes de plantilla se colocan comúnmente en la carpeta src/layouts
en tu proyecto, pero esto no es un requisito; puedes elegir ubicarlos en cualquier lugar de tu proyecto. Incluso puedes colocar las plantillas junto a tus páginas mediante el uso de un prefijo _
en los nombres de las plantillas.
Plantilla de ejemplo
Sección titulada Plantilla de ejemploPlantillas de Markdown/MDX
Sección titulada Plantillas de Markdown/MDXLas plantillas de página son especialmente útiles para páginas de Markdown y MDX de lo contrario no tendría ningún estilo de página.
Astro proporciona una propiedad frontmatter especial layout
para especificar cual componente .astro
usar como plantilla de página.
Una plantilla típica para Markdown o páginas MDX incluye:
- La prop
frontmatter
para acceder al Markdown o frontmatter de la página MDX y otra información. - Un
<slot />
por defecto para indicar el lugar donde el contenido Markdown/MDX de la página será renderizado.
Puedes establecer el tipo de una plantilla como Props
con el ayudante MarkdownLayoutProps
o MDXLayoutProps
:
Props de plantillas Markdown
Sección titulada Props de plantillas MarkdownUna plantilla Markdown/MDX tendrá acceso a la siguiente información a través de Astro.props
:
file
- La ruta absoluta de este archivo (por ejemplo,/home/user/projects/.../file.md
).url
- Si es una página, la URL de la página (por ejemplo,/en/guides/markdown-content
).frontmatter
- Todo el frontmatter del documento Markdown o MDX.frontmatter.file
- La misma que la propiedad de nivel superiorfile
.frontmatter.url
- La misma que la propiedad de nivel superiorurl
.
headings
- Una lista de encabezados (h1 -> h6
) en el documento Markdown o MDX con metadatos asociados. Esta lista sigue el tipo:{ depth: number; slug: string; text: string }[]
.- (solo Markdown)
rawContent()
- Una función que devuelve el documento Markdown en bruto como una cadena. - (solo Markdown)
compiledContent()
- Una función que devuelve el documento Markdown compilado como un string HTML.
Por ejemplo en un artículo de blog en Markdown puede pasar el siguiente objeto Astro.props
a su plantilla:
Una plantilla Markdown/MDX tendrá acceso a todas sus propiedades exportadas desde Astro.props
con algunas diferencias clave:
-
Información de encabezados (es decir, elementos
h1 -> h6
) están disponibles a través del arrayheadings
, en lugar de la funcióngetHeadings()
. -
file
yurl
también están disponibles como propiedades anidadas defrontmatter
(es decir,frontmatter.url
yfrontmatter.file
). -
Valores definidos fuera del frontmatter (por ejemplo, declaraciones
export
en MDX) no están disponibles. Considera importar una plantilla en su lugar.
Importando Plantillas Manualmente (MDX)
Sección titulada Importando Plantillas Manualmente (MDX)Puedes necesitar pasar información a tu plantilla MDX que no (o no puede) existir en tu frontmatter. En este caso, en su lugar, puedes importar y usar un componente <Layout />
y pasarle propiedades como cualquier otro componente:
Luego, tus valores estarán disponibles para ti a través de Astro.props
en tu plantilla, y tu contenido MDX se inyectará en la página donde se escriba tu componente <slot />
:
Usando una plantilla para .md
, .mdx
y .astro
Sección titulada Usando una plantilla para .md, .mdx y .astroUna sola plantilla Astro puede ser escrita para recibir el objeto frontmatter
de archivos .md
y .mdx
, así como cualquier propiedad nombrada pasada desde archivos .astro
.
En el ejemplo a continuación, la plantilla mostrará el título de la página ya sea desde una propiedad YAML title
del frontmatter o desde un componente Astro que pasa un atributo title
:
Plantillas anidadas
Sección titulada Plantillas anidadasLos componentes de plantilla no necesitan contener una página completa de HTML. Puedes dividir tus plantillas en componentes más pequeños y luego combinar estos componentes para crear plantillas aún más flexibles, como una plantilla de página. Este patrón es útil cuando deseas compartir cierto código entre múltiples plantillas.
Por ejemplo, un componente de plantilla BlogPostLayout.astro
podría dar estilo a un título, fecha y autor de un post. Luego, una plantilla BaseLayout.astro
podría manejar el resto de tu plantilla de página, como navegación, pies de página, etiquetas meta de SEO, estilos globales y fuentes. También puedes pasar propiedades recibidas de tu post a otra plantilla, como cualquier otro componente anidado.