Макеты
Макеты - это компоненты Astro, которые определяют структуру пользовательского интерфейса(UI), например, шаблоны страниц.
Мы условно используем термин “макет” для компонентов Astro, которые создают общие элементы UI, такие как заголовки, панели навигации и нижние колонтитулы, используемые на разных страницах. Типичный компонент макета Astro используется для предоставления страницам Astro, Markdown или MDX следующего:
- оболочки страницы (теги
<html>,<head>и<body>) <slot />, чтобы указать, куда должно быть вставлено содержимое отдельной страницы.
Но в макетном компоненте нет ничего особенного! Они могут принимать свойства и импортировать и использовать другие компоненты, как и любой другой компонент Astro. Они могут включать в себя компоненты UI-фреймворков и скрипты на стороне клиента. Они даже не обязательно должны предоставлять полную оболочку страницы, вместо этого их можно использовать как частичные шаблоны пользовательского интерфейса.
Компоненты макета обычно помещаются в раздел src/layouts в вашем проекте для организации, но это не является обязательным; вы можете выбрать местоположение по своему усмотрению. Вы даже можете поместить компоненты макета рядом со своими страницами, добавив префикс _ к именам макетов.
Пример Макета
Заголовок раздела Пример Макета---import BaseHead from '../components/BaseHead.astro';import Footer from '../components/Footer.astro';const { title } = Astro.props;---<html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <BaseHead title={title}/> </head> <body> <nav> <a href="#">Home</a> <a href="#">Posts</a> <a href="#">Contact</a> </nav> <h1>{title}</h1> <article> <slot /> <!-- Ваше содержимое вставляется сюда --> </article> <Footer /> </body></html>---import MySiteLayout from '../layouts/MySiteLayout.astro';---<MySiteLayout title="Home Page"> <p>Мой контент, обернутый в макет!</p></MySiteLayout>Markdown/MDX макеты
Заголовок раздела Markdown/MDX макетыМакеты страниц особенно полезны для Markdown и MDX файлов, которые иначе не имели бы какого-либо форматирования.
Astro предоставляет специальное свойство layout frontmatter, чтобы указать, какой компонент .astro использовать в качестве макета страницы.
---layout: ../layouts/BaseLayout.astrotitle: "Hello, World!"author: "Matthew Phillips"date: "09 Aug 2022"---Все свойства frontmatter доступны в качестве входных параметров компонента для макета Astro.
Свойство `layout` - единственное специальное свойство, предоставляемое Astro.
Вы можете использовать его как в Markdown, так и в MDX-файлах, расположенных внутри `src/pages/`.Типичный макет для страниц Markdown или MDX включает в себя:
- Свойство
frontmatterдля доступа к frontmatter и другим данным страницы Markdown или MDX. - Cтандартный
<slot />для указания места, где должно быть отображено содержимое страницы в формате Markdown/MDX.
---// 1. Свойство frontmatter предоставляет доступ к frontmatter и другим даннымconst { frontmatter } = Astro.props;---<html> <head> <!-- Добавьте сюда другие элементы <head>, такие как стили и мета-теги. --> <title>{frontmatter.title}</title> </head> <body> <!-- Добавьте сюда другие компоненты UI, такие как верхний и нижний колонтитулы страницы. --> <h1>{frontmatter.title} by {frontmatter.author}</h1> <!-- 2. Готовый HTML будет передан в стандартный слот. --> <slot /> <p>Written on: {frontmatter.date}</p> </body></html>Вы можете установить тип входных параметров компонента макета с помощью вспомогательных функций MarkdownLayoutProps или MDXLayoutProps:
---import type { MarkdownLayoutProps } from 'astro';
type Props = MarkdownLayoutProps<{ // Здесь определите свойства frontmatter title: string; author: string; date: string;}>;
// Теперь свойства макета Markdown, такие как `frontmatter`, `url`,// и другие, доступны с типобезопасностьюconst { frontmatter, url } = Astro.props;---<html> <head> <link rel="canonical" href={new URL(url, Astro.site).pathname}> <title>{frontmatter.title}</title> </head> <body> <h1>{frontmatter.title} by {frontmatter.author}</h1> <slot /> <p>Written on: {frontmatter.date}</p> </body></html>Свойства макета Markdown
Заголовок раздела Свойства макета MarkdownМакет Markdown/MDX будет иметь доступ к следующей информации через Astro.props:
file- Абсолютный путь этого файла (например,/home/user/projects/.../file.md).url- Если это страница, то URL страницы (например,/en/guides/markdown-content).frontmatter- Вся мета-информация из документа Markdown или MDX.frontmatter.file- То же, что и свойство верхнего уровняfile.frontmatter.url- То же, что и свойство верхнего уровняurl.
headings- Список заголовков (h1 -> h6) в документе Markdown или MDX с соответствующими метаданными. Этот список следует типу:{ depth: number; slug: string; text: string }[].- (Только для Markdown)
rawContent()- Функция, возвращающая необработанный документ Markdown в виде строки. - (Только для Markdown)
compiledContent()- Функция, возвращающая документ Markdown, скомпилированный в HTML-строку.
Пример записи блога в формате Markdown может передавать в макет следующий объект Astro.props:
Astro.props = { file: "/home/user/projects/.../file.md", url: "/en/guides/markdown-content/", frontmatter: { /** Frontmatter из записи в блоге */ title: "Astro 0.18 Release", date: "Tuesday, July 27 2021", author: "Matthew Phillips", description: "Astro 0.18 is our biggest release since Astro launch.", /** Сгенерированные значения */ file: "/home/user/projects/.../file.md", url: "/en/guides/markdown-content/" }, headings: [ { "depth": 1, "text": "Astro 0.18 Release", "slug": "astro-018-release" }, { "depth": 2, "text": "Responsive partial hydration", "slug": "responsive-partial-hydration" } /* ... */ ],
/** Доступно только для Markdown */ rawContent: () => "# Astro 0.18 Release\nA little over a month ago, the first public beta [...]", compiledContent: () => "<h1>Astro 0.18 Release</h1>\n<p>A little over a month ago, the first public beta [...]</p>",}Макет Markdown/MDX будет иметь доступ ко всем экспортированным свойствам своего файла из Astro.props с некоторыми ключевыми отличиями:.
-
Информация о заголовках (т.е. элементы
h1 -> h6) доступна через массивheadings, а не через функциюgetHeadings(). -
fileиurlтакже *доступны как вложенные свойстваfrontmatter(т.е.frontmatter.urlиfrontmatter.file). -
Значения, определенные вне frontmatter (например, операторы
exportв MDX), недоступны. Вместо этого рассмотрите импорт макета.
Импорт макетов вручную (MDX)
Заголовок раздела Импорт макетов вручную (MDX)Вам может понадобиться передать в MDX макет информацию, которая не существует (или не может существовать) в frontmatter. В этом случае вы можете импортировать и использовать компонент <Layout /> и передавать ему входные параметры, как любому другому компоненту:
---layout: ../../layouts/BaseLayout.astrotitle: 'My first MDX post'publishDate: '21 September 2022'---import BaseLayout from '../../layouts/BaseLayout.astro';
export function fancyJsHelper() { return "Try doing that with YAML!";}
<BaseLayout title={frontmatter.title} fancyJsHelper={fancyJsHelper}>. Welcome to my new Astro blog, using MDX!</BaseLayout>Затем ваши значения будут доступны вам через Astro.props в вашем макете, и ваш MDX-контент будет внедрен на страницу, где прописан ваш компонент <slot />:
---const { title, fancyJsHelper } = Astro.props;---<!-- --><h1>{title}</h1><slot /> <!-- здесь вставляется ваш контент --><p>{fancyJsHelper()}</p><!-- -->Использование одного макета для .md, .mdx и .astro
Заголовок раздела Использование одного макета для .md, .mdx и .astroМожно написать один макет Astro, который будет принимать объект frontmatter из файлов .md и .mdx, а также любые именованные входные параметры, передаваемые из файлов .astro.
В приведенном ниже примере макет будет отображать заголовок страницы либо из свойства title в frontmatter YAML, либо из атрибута title, переданного компонентом Astro:
---const { title } = Astro.props.frontmatter || Astro.props;---<html> <head></head> <body> <h1>{title}</h1> <slot /> </body></html>Вложенные макеты
Заголовок раздела Вложенные макетыКомпоненты макета не обязательно должны содержать целую страницу HTML. Вы можете разбить свои макеты на более мелкие компоненты и комбинировать их, чтобы создавать еще более гибкие шаблоны страниц. Этот шаблон полезен, когда вы хотите совместно использовать некоторый код в нескольких макетах.
Например, макет компонента BlogPostLayout.astro может стилизовать заголовок, дату и автора статьи. Затем, глобальный макет BaseLayout.astro может обрабатывать остальную часть вашего шаблона страницы, такую как навигация, нижние колонтитулы, мета-теги SEO, глобальные стили и шрифты. Вы также можете передавать входные параметры, полученные из вашей статьи, в другой макет, так же как и любой другой вложенный компонент.
---import BaseLayout from './BaseLayout.astro';const { frontmatter } = Astro.props;---<BaseLayout url={frontmatter.url}> <h1>{frontmatter.title}</h1> <h2>Post author: {frontmatter.author}</h2> <slot /></BaseLayout>