Erstelle dein erstes Layout
Mach dich bereit, …
- gemeinsame Elemente in ein Seiten-Layout zu refaktorieren (refactor)
- ein Astro-
<slot />-Element zu verwenden, um Seiteninhalte innerhalb eines Layouts zu platzieren - seitenspezifische Werte als Props an dein Layout zu übergeben
Du hast noch einige Astro-Komponenten, die auf jeder Seite wiederholt gerendert werden. Es ist Zeit für eine weitere Refaktorierung (Refactoring), um ein gemeinsames Seiten-Layout zu erstellen!
Erstelle deine erste Layout-Komponente
Erstelle eine neue Datei unter
src/layouts/BaseLayout.astro. (Du musst vorher einen neuen Ordnerlayoutsanlegen.)Kopiere den gesamten Inhalt von
index.astroin deine neue DateiBaseLayout.astro.--- import Header from '../components/Header.astro'; import Footer from '../components/Footer.astro'; import '../styles/global.css'; const pageTitle = "Startseite"; --- <html lang="en"> <head> <meta charset="utf-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width" /> <meta name="generator" content={Astro.generator} /> <title>{pageTitle}</title> </head> <body> <Header /> <h1>{pageTitle}</h1> <Footer /> <script> import "../scripts/menu.js"; </script> </body> </html>
Verwende dein Layout auf einer Seite
Ersetze den Code in
src/pages/index.astrodurch Folgendes:--- import BaseLayout from '../layouts/BaseLayout.astro'; const pageTitle = "Startseite"; --- <BaseLayout> <h2>Mein großartiger Blog-Untertitel</h2> </BaseLayout>Prüfe die Vorschau im Browser erneut, um zu sehen, was sich geändert hat (Spoiler: vielleicht nicht viel).
Füge ein
<slot />-Element insrc/layouts/BaseLayout.astrodirekt oberhalb des Footer-Elements hinzu, und prüfe dann die Vorschau deiner Startseite, um zu sehen, was sich diesmal tatsächlich geändert hat!--- import Header from '../components/Header.astro'; import Footer from '../components/Footer.astro'; import '../styles/global.css'; const pageTitle = "Startseite"; --- <html lang="en"> <head> <meta charset="utf-8" /> <link rel="icon" type="image/svg+xml" href="/favicon.svg" /> <meta name="viewport" content="width=device-width" /> <meta name="generator" content={Astro.generator} /> <title>{pageTitle}</title> </head> <body> <Header /> <h1>{pageTitle}</h1> <slot /> <Footer /> <script> import "../scripts/menu.js"; </script> </body> </html>
Das <slot />-Element ermöglicht es, Kindelemente einzufügen (oder „einzuschieben“), die zwischen den öffnenden und schließenden <Component></Component>-Tags in jede Component.astro-Datei geschrieben werden.
Übergib seitenspezifische Werte als Props
Übergib den Seitentitel von
index.astroan dein Layout über ein Komponenten-Attribut:--- import BaseLayout from '../layouts/BaseLayout.astro'; const pageTitle = "Startseite"; --- <BaseLayout pageTitle={pageTitle}> <h2>Mein großartiger Blog-Untertitel</h2> </BaseLayout>Passe das Skript deiner
BaseLayout.astro-Komponente an, sodass es den Seitentitel überAstro.propserhält, anstatt ihn als Konstante zu definieren.--- import Header from '../components/Header.astro'; import Footer from '../components/Footer.astro'; import '../styles/global.css'; const pageTitle = "Startseite"; const { pageTitle } = Astro.props; ---Prüfe die Browser-Vorschau, um sicherzustellen, dass sich der Seitentitel nicht verändert hat. Er wird nun dynamisch gerendert, und jede einzelne Seite kann jetzt ihren eigenen Titel an das Layout übergeben.
Probiere es selbst – Verwende dein Layout überall
Refaktoriere deine anderen Seiten (blog.astro und about.astro), sodass sie dein neues <BaseLayout>-Element verwenden, um die gemeinsamen Seitenelemente zu rendern.
Denk daran:
Übergib einen Seitentitel als Prop über ein Komponenten-Attribut.
Lass das Layout für das HTML-Rendering aller gemeinsamen Elemente verantwortlich sein.
Verschiebe vorhandene
<style>-Tags aus dem<head>der Seite in die Seiten-HTML-Vorlage, wenn du diese Styles behalten möchtest.Lösche alles von jeder einzelnen Seite, was nun vom Layout übernommen wird, einschließlich:
- HTML-Elemente
- Komponenten und deren Imports
- CSS-Regeln in einem
<style>-Tag (z. B.<h1>auf der Über mich-Seite) <script>-Tags
:::note[Behalte deine „Über mich“-Seite-Styles]Wenn du <BaseLayout> für deine about.astro-Seite verwendest, verlierst du das <style>-Tag, das zuvor im <head> dieser Seite war. Um weiterhin nur auf Seitenebene mit Astro-Scoped-Styles zu stylen, verschiebe das <style>-Tag in den Body der Seiten-Komponente. So kannst du Elemente, die in dieser Seiten-Komponente erstellt wurden, weiter stylen (z. B. deine Liste von Skills).
Da dein <h1> jetzt vom Layout erstellt wird, kannst du das Attribut is:global zu deinem Style-Tag hinzufügen, um jedes Element auf dieser Seite zu beeinflussen, einschließlich derjenigen, die von anderen Komponenten erstellte werden: <style is:global define:vars={{ skillColor, fontWeight, textCase }}>:::
Teste dein Wissen
Eine Astro-Komponente (
.astro-Datei) kann fungieren als:Um einen Seitentitel auf der Seite anzuzeigen, kannst du:
Informationen können von einer Komponente zur anderen übergeben werden durch: