Layout
Layouty to komponenty Astro używane do tworzenia ponownie używalnej struktury UI, takiej jak szablon strony.
Umownie korzystamy z terminu “layout” dla komponentów, które zapewniają wspólne elementy interfejsu wspóldzielone na stronach, takie jak stopki, nagłówki czy nawigacja. Najczęściej layout przekazuje stronom Astro, Markdown bądź MDX:
- powłokę strony (tagi
<html>
,<head>
i<body>
) - tag
<slot />
aby okreslić miejsce gdzie treść ma zostać wstrzyknięta.
Ale w komponencie układu nie ma nic szczególnego! Layouty mogą akceptować propy oraz importować i korzystać z innych komponentów jak każdy inny komponent Astro. Potrafią też zawierać w sobie komponenty frameworków UI i skrypty client-side. Nie muszą nawet posiadać całej powłoki strony, a jedynie być wykorzystywane jako cząstkowe szablony UI.
Jednakże, jeśli komponent layout’u zawiera powłokę strony, to jego tag <html>
musi być elementem nadrzędnym wszystkich innych elementów. Wszystkie znaczniki <style>
lub <script>
muszą zostać zawarte w elemencie <html>
.
Komponenty layout’u zazwyczaj znajdują się w folderze src/layouts
Twojego projektu, aby zadbać o organizację. Nie jest to jednak wymóg; możesz je umieszczać w dowolnym miejscu projektu. Mogą one nawet istnieć obok swoich stron, przez dodanie prefiksu _
do nazw layout’ów.
Przykładowy layout
Dział zatytułowany Przykładowy layoutUżywanie TypeScript w layout’ach
Dział zatytułowany Używanie TypeScript w layout’achKażdy layout Astro można zmodyfikować tak, aby wprowadzić bezpieczeństwo typów i automatyczne uzupełnianie, podając typy dla swoich propów:
Layouty Markdown
Dział zatytułowany Layouty MarkdownLayouty stron są szczególnie użyteczne w przypadku pojedynczych stron Markdown, które w innym wypadku nie miałyby żadnego formatowania.
Astro udostępnia specjalną właściwość frontmatter layout
, która pozwala określić, który komponent .astro
ma zostać użyty jako layout strony. Domyślnie ten określony komponent może automatycznie odbierać dane z pliku Markdown.
Typowy layout strony Markdown zawiera:
- Prop
frontmatter
umożliwiający dostęp do frontmatteru strony Markdown i innych danych. - Domyślny tag
<slot />
wskazujący miejsce, gdzie ma wyrenderować się zawartość strony Markdown.
Możesz ustawić typ Props
layout’u z pomocnikiem MarkdownLayoutProps
:
Propy layout’u Markdown
Dział zatytułowany Propy layout’u MarkdownLayout Markdown będzie miał dostęp do tych informacji dzięki Astro.props
:
file
- Ścieżka absolutna do pliku (np./home/user/projects/.../file.md
).url
- Adres URL strony (np./pl/guides/markdown-content
).frontmatter
- Każdy element frontmatter z dokumentów Markdown lub MDX.frontmatter.file
- Taka sama jak właściwośćfile
najwyższego poziomu.frontmatter.url
- Taka sama jak właściwośćurl
najwyższego poziomu.
headings
- Lista nagłówków (h1 -> h6
) w dokumencie Markdown lub MDX z powiązanymi metadanymi. Ta lista jest zgodna z typem:{ depth: number; slug: string; text: string }[]
.rawContent()
- Funkcja zwracająca surowy dokument Markdown jako ciąg znaków.compiledContent()
- Funkcja zwracająca dokument Markdown skompilowany do ciągu HTML.
Layout Markdown będzie miał dostęp do wszystkich dostępnych właściwości pliku Markdown z Astro.props
z dwoma kluczowymi różnicami:
-
Informacje o nagłówku (czyli elementy
h1 -> h6
) są dostępne za pomocą tablicyheadings
, a nie funkcjigetHeadings()
. -
file
iurl
także są dostępne jako zagnieżdżone właściwościfrontmatter
(czylifrontmatter.url
ifrontmatter.file
).
Importowanie layout’ów ręcznie (MDX)
Dział zatytułowany Importowanie layout’ów ręcznie (MDX)Możesz również użyć specjalnej właściwości layout
w frontmatter plików MDX, aby przekazać frontmatter
i headings
bezpośrednio do określonego komponentu layout’u w ten sam sposób.
Aby przekazać informacje do layout’u MDX, które nie istnieją (lub nie mogą istnieć) w Twoim frontmatter, możesz zamiast tego zaimportować i użyć komponentu <Layout />
. Działa to jak każdy inny komponent Astro i nie otrzyma automatycznie żadnych propów. Przekaż mu niezbędne propy bezpośrednio:
Potem Twoje wartości będą dostępne dla Ciebie poprzez Astro.props
w layout’cie, a Twoja zawartość MDX zostanie wstrzyknięta na stronę tam, gdzie jest napisany komponent <slot />
:
Zagnieżdżanie layout’ów
Dział zatytułowany Zagnieżdżanie layout’ówKomponenty layout’u nie muszą zawierać całej strony HTML. Możesz podzielić swoje Layouty na mniejsze komponenty, a następnie łączyć je, aby stworzyć jeszcze bardziej elastyczne szablony stron. Ten wzorzec jest przydatny, gdy chcesz współdzielić kod między wieloma layout’ami.
Dla przykładu, layout BlogPostLayout.astro
mógłby stylować tytuł, datę i autora posta. Następnie, globalny layout BaseLayout.astro
mógłby obsługiwać resztę szablonu strony, takie jak nawigację, stopki, tagi meta SEO, globalne style i czcionki. Możesz również przekazać propy otrzymane z Twojego posta do innego layout’u, tak jak każdy inny zagnieżdzony komponent.