Composants
Les composants Astro sont les Ă©lĂ©ments de base de tout projet Astro. Il sâagit de composants de modĂšles en HTML uniquement, sans environnement dâexĂ©cution cĂŽtĂ© client et qui utilisent lâextension de fichier .astro.
Si vous connaissez le HTML, vous en savez déjà assez pour écrire votre premier composant Astro.
Les composants Astro sont extrĂȘmement flexibles. Un composant Astro peut ĂȘtre aussi petit quâun extrait de HTML, comme une collection de balises <meta> communes qui facilitent le travail de rĂ©fĂ©rencement. Les composants peuvent ĂȘtre des Ă©lĂ©ments rĂ©utilisables de lâinterface utilisateur, comme un en-tĂȘte ou une fiche de profil. Les composants Astro peuvent mĂȘme contenir une mise en page entiĂšre ou, lorsquâils sont situĂ©s dans le dossier spĂ©cial src/pages/, ĂȘtre une page entiĂšre.
La chose la plus importante Ă savoir Ă propos des composants Astro est quâils ne sont pas gĂ©nĂ©rĂ©s cĂŽtĂ© client. Ils sont restituĂ©s en HTML soit au moment de la compilation, soit Ă la demande. Vous pouvez inclure du code JavaScript Ă lâintĂ©rieur du frontmatter de votre composant, et tout ce code sera retirĂ© de la page finale envoyĂ©e aux navigateurs de vos utilisateurs. Le rĂ©sultat est un site plus rapide, sans aucune empreinte JavaScript ajoutĂ©e par dĂ©faut.
Lorsque votre composant Astro nĂ©cessite une interactivitĂ© cĂŽtĂ© client, vous pouvez ajouter des balises HTML standards de <script> ou des composants de framework UI en tant quâ« Ăźlots de client ».
Pour les composants qui doivent afficher du contenu personnalisĂ© ou dynamique, vous pouvez diffĂ©rer leur rendu sur le serveur en ajoutant une directive serveur. Ces « Ăźlots de serveur » restitueront leur contenu lorsquâil sera disponible, sans retarder le chargement complet de la page.
Structure du composant
Section intitulée « Structure du composant »Un composant Astro est composé de deux parties principales : le script du composant et le modÚle du composant. Chaque partie accomplit un travail différent, mais ensemble, elles fournissent un cadre à la fois facile à utiliser et suffisamment expressif pour gérer tout ce que vous souhaitez créer.
---// Script du composant (JavaScript)---<!-- ModĂšle du composant (HTML + Expressions JS) -->Le script du composant
Section intitulĂ©e « Le script du composant »Astro utilise des dĂ©limiteurs de code (---) pour identifier le script du composant dans votre composant Astro. Si vous avez dĂ©jĂ Ă©crit du Markdown avant, vous pourriez ĂȘtre dĂ©jĂ familier avec un concept similaire appelĂ© frontmatter. Astro est directement inspirĂ© de cela.
Vous pouvez utiliser le script du composant pour écrire le code JavaScript nécessaire au rendu de votre modÚle. Cela peut inclure :
- importer dâautres composants Astro
- importer des composants de framework, comme React
- importer des données, comme un fichier JSON
- rĂ©cupĂ©rer du contenu Ă partir dâune API ou dâune base de donnĂ©es
- créer des variables que vous voulez référencer dans votre modÚle
---import UnComposantAstro from '../components/UnComposantAstro.astro';import UnComposantReact from '../components/UnComposantReact.jsx';import desDonnees from '../data/pokemon.json';
// Accéder aux props de composants transmis, comme `<X title="Hello, World" />`const { title } = Astro.props;
// RĂ©cupĂ©rer des donnĂ©es externes, mĂȘme Ă partir d'une API ou d'une base de donnĂ©es privĂ©econst data = await fetch('UNE_URL_SECRETE_API/utilisateurs').then(r => r.json());---<!-- Votre modĂšle ici ! -->Le dĂ©limiteur de code est conçu pour garantir que le code JavaScript que vous Ă©crivez Ă lâintĂ©rieur « ne puisse pas sâĂ©chapper ». Il ne sera pas visible dans le frontend de votre application et ne tombera pas entre les mains de votre utilisateur. Vous pouvez Ă©crire du code JavaScript coĂ»teux (en terme de performance) ou sensible (comme un appel Ă votre base de donnĂ©es privĂ©e) sans vous soucier quâil se retrouve dans le navigateur lâutilisateur.
Le script du composant Astro utilise TypeScript, ce qui vous permet dâajouter une syntaxe supplĂ©mentaire Ă JavaScript pour les outils dâĂ©dition et la vĂ©rification des erreurs.
Le modĂšle du composant
Section intitulée « Le modÚle du composant »Le modÚle de composant se trouve sous le délimiteur de code et détermine la sortie HTML de votre composant.
Si vous Ă©crivez du HTML brut ici, votre composant affichera ce HTML dans nâimporte quelle page Astro oĂč il est importĂ© et utilisĂ©.
Cependant, la syntaxe du modĂšle de composant dâAstro prend Ă©galement en charge les expressions JavaScript, les balises <style> et <script> dâAstro, les composants importĂ©s et les directives spĂ©ciales dâAstro. Les donnĂ©es et valeurs dĂ©finies dans le script du composant peuvent ĂȘtre utilisĂ©es dans le modĂšle de composant pour produire du HTML créé dynamiquement.
---// Le script de votre composant ici !import Banner from '../components/Banner.astro';import Avatar from '../components/Avatar.astro';import ReactPokemonComponent from '../components/ReactPokemonComponent.jsx';const myFavoritePokemon = [/* ... */];const { title } = Astro.props;---<!-- Les commentaires HTML sont pris en charge ! -->{/* La syntaxe des commentaires JavaScript est aussi valide ! */}
<Banner /><h1>Hello, world!</h1>
<!-- Utiliser les props et autres variables du script du composant : --><p>{title}</p>
<!-- Retarder le rendu des composants et fournir un contenu de chargement de secours : --><Avatar server:defer> <svg slot="fallback" class="avatar-generique" transition:name="avatar">...</svg></Avatar>
<!-- Inclure d'autres composants de framework UI avec une directive `client:` pour l'hydrater : --><ReactPokemonComponent client:visible />
<!-- Mélanger du HTML avec des expressions JavaScript, similaire à la syntaxe JSX : --><ul> {myFavoritePokemon.map((data) => <li>{data.name}</li>)}<ul>
<!-- Utiliser une directive de modĂšle pour crĂ©er des noms de classe Ă partir de plusieurs chaĂźnes de caractĂšres ou mĂȘme dâobjets ! --><p class:list={["ajouter", "dynamiquement", { desClasses: true }]} />Conception basĂ©e sur les composants
Section intitulĂ©e « Conception basĂ©e sur les composants »Les composants sont conçus pour ĂȘtre rĂ©utilisables et composables. Vous pouvez utiliser des composants Ă lâintĂ©rieur dâautres composants pour crĂ©er une interface utilisateur de plus en plus complexe. Par exemple, un composant Button pourrait ĂȘtre utilisĂ© pour crĂ©er un composant ButtonGroup comme ceci :
---import Button from './Button.astro';---<div> <Button title="Bouton 1" /> <Button title="Bouton 2" /> <Button title="Bouton 3" /></div>Props de composant
Section intitulĂ©e « Props de composant »Un composant Astro peut dĂ©finir et accepter des props (diminutif pour « propriĂ©tĂ©s »). Ces derniĂšres deviennent alors disponibles dans le modĂšle du composant pour le rendu du HTML. Les props sont accessibles Ă lâaide de la variable globale Astro.props dans le frontmatter, ou script du composant.
Voici un exemple de composant qui reçoit une propriĂ©tĂ© nommĂ©e greeting et une autre nommĂ©e name. Notez que les props Ă recevoir sont dĂ©structurĂ©es de lâobjet global Astro.props.
---// Utilisation : <GreetingHeadline greeting="Comment ça va" name="Partenaire" />const { greeting, name } = Astro.props;---<h2>{greeting}, {name} !</h2>Ce composant, lorsquâil est importĂ© et rendu dans dâautres composants, mises en page ou pages Astro, peut transmettre ces props sous forme dâattributs :
---import GreetingHeadline from './GreetingHeadline.astro';const name = 'Astro';---<h1>Carte de bienvenue</h1><GreetingHeadline greeting="Salut" name={name} /><p>J'espĂšre que vous passez une merveilleuse journĂ©e !</p>Vous pouvez Ă©galement dĂ©finir le type de vos props avec TypeScript en crĂ©ant une interface nommĂ©e Props. Astro sĂ©lectionnera automatiquement lâinterface Props dans le frontmatter et donnera des avertissements/erreurs de type. Ces props peuvent Ă©galement recevoir des valeurs par dĂ©faut lorsquâelles sont dĂ©structurĂ©es Ă partir dâAstro.props.
---interface Props { name: string; greeting?: string;}
const { greeting = "Salut", name } = Astro.props;---<h2>{greeting}, {name} !</h2>Les props de composant peuvent recevoir des valeurs par dĂ©faut Ă utiliser lorsquâaucune nâest fournie.
---const { greeting = "Salut", name = "Astronaute" } = Astro.props;---<h2>{greeting}, {name} !</h2>Les slots
Section intitulĂ©e « Les slots »LâĂ©lĂ©ment <slot /> est une balise substituable par du contenu HTML externe, vous permettant dâinjecter des Ă©lĂ©ments enfants depuis dâautres fichiers dans votre modĂšle de composant.
Par défaut, tous les éléments enfants passés à un composant seront restitués dans son <slot />.
Contrairement aux props, qui sont des attributs transmis Ă un composant Astro et accessibles dans lâensemble de ce composant avec Astro.props, les slots restituent les Ă©lĂ©ments HTML enfants lĂ oĂč ils sont placĂ©s.
---import Header from './Header.astro';import Logo from './Logo.astro';import Footer from './Footer.astro';
const { title } = Astro.props;---<div id="content-wrapper"> <Header /> <Logo /> <h1>{title}</h1> <slot /> <!-- les Ă©lement enfants seront insĂ©rĂ©s ici --> <Footer /></div>---import Wrapper from '../components/Wrapper.astro';---<Wrapper title="Page de Fred"> <h2>Tout ce qui est a savoir sur Fred</h2> <p>Voici quelques trucs Ă propos de Fred.</p></Wrapper>Ce modĂšle est la base dâun composant de mise en page Astro : une page entiĂšre de contenu HTML peut ĂȘtre « enveloppĂ©e » avec des balises <Layout></Layout> et envoyĂ©e au composant pour ĂȘtre restituĂ©e Ă lâintĂ©rieur des Ă©lĂ©ments de page communs qui y sont dĂ©finis.
Astro.slots pour dĂ©couvrir dâautres moyens dâaccĂ©der au contenu des slots et de le restituer.
Les slots nommés
Section intitulĂ©e « Les slots nommĂ©s »Un composant Astro peut aussi avoir des slots nommĂ©s. Cela vous permet de transmettre uniquement les Ă©lĂ©ments HTML portant le nom du slot correspondant Ă lâemplacement dâun slot.
Les slots sont nommĂ©s Ă lâaide de lâattribut name :
---import Header from './Header.astro';import Logo from './Logo.astro';import Footer from './Footer.astro';
const { title } = Astro.props;---<div id="content-wrapper"><Header /><!-- les enfants avec l'attribut `slot="after-header"` iront ici --><slot name="after-header" /><Logo /><h1>{title}</h1><!-- les enfants sans `slot` ou avec l'attribut `slot="default"` iront ici --><slot /><Footer /><!-- les enfants avec l'attribut `slot="after-footer"` iront ici --><slot name="after-footer" /></div>Pour injecter du contenu HTML dans un slot particulier, utilisez lâattribut slot sur nâimporte quel Ă©lĂ©ment enfant pour spĂ©cifier le nom du slot. Tous les autres Ă©lĂ©ments enfants du composant seront injectĂ©s dans le <slot /> par dĂ©faut (sans nom).
---import Wrapper from '../components/Wrapper.astro';---<Wrapper title="Page de Fred"> <img src="https://ma.photo/fred.jpg" slot="after-header" /> <h2>Tout ce qui est a savoir sur Fred</h2> <p>Voici quelques trucs Ă propos de Fred.</p> <p slot="after-footer">Copyright 2022</p></Wrapper>Utilisez un attribut slot="mon-slot" sur lâĂ©lĂ©ment enfant que vous souhaitez transmettre Ă un emplacement rĂ©servĂ© <slot name="mon-slot" /> correspondant dans votre composant.
Pour transmettre plusieurs Ă©lĂ©ments HTML dans lâemplacement rĂ©servĂ© <slot/> dâun composant sans quâils soient enveloppĂ©s par une balise <div>, utilisez lâattribut slot="" sur le composant <Fragment/> dâAstro:
---// CrĂ©e un tableau personnalisĂ© avec des slots nommĂ©s pour le contenu de l'en-tĂȘte et du corps---<table class="bg-white"> <thead class="sticky top-0 bg-white"><slot name="header" /></thead> <tbody class="[&_tr:nth-child(odd)]:bg-gray-100"><slot name="body" /></tbody></table>Injectez plusieurs lignes et colonnes de contenu HTML en utilisant un attribut slot="" pour spĂ©cifier le contenu de lâen-tĂȘte ("header") et du corps ("body"). Les Ă©lĂ©ments HTML individuels peuvent Ă©galement ĂȘtre mis en forme :
---import CustomTable from './CustomTable.astro';---<CustomTable> <Fragment slot="header"> <!-- passer l'en-tĂȘte du tableau --> <tr><th>Nom du produit</th><th>UnitĂ©s en stock</th></tr> </Fragment>
<Fragment slot="body"> <!-- passer le corps du tableau --> <tr><td>Tongs</td><td>64</td></tr> <tr><td>Bottes</td><td>32</td></tr> <tr><td>Baskets</td><td class="text-red-500">0</td></tr> </Fragment></CustomTable>Notez que les slots nommĂ©s doivent ĂȘtre des enfants immĂ©diats du composant. Il nâest pas possible de transmettre des slots nommĂ©s Ă travers des Ă©lĂ©ments imbriquĂ©s.
Les slots nommĂ©s peuvent aussi ĂȘtre transmis aux composants de framework UI !
Il nâest pas possible de gĂ©nĂ©rer dynamiquement un nom de slot Astro en utilisant, par exemple, la mĂ©thode map. Si cette fonctionnalitĂ© est nĂ©cessaire dans les composants du framework UI, il est prĂ©fĂ©rable de gĂ©nĂ©rer ces slots dynamiques dans le framework lui-mĂȘme.
Contenu de repli pour les slots
Section intitulĂ©e « Contenu de repli pour les slots »Les slots peuvent Ă©galement restituer du contenu de repli. Lorsquâaucun enfant correspondant nâest transmis Ă un slot, un Ă©lĂ©ment <slot /> utilisera ses propres enfants comme contenu par dĂ©faut.
---import Header from './Header.astro';import Logo from './Logo.astro';import Footer from './Footer.astro';
const { title } = Astro.props;---<div id="content-wrapper"> <Header /> <Logo /> <h1>{title}</h1> <slot> <p>Ceci est mon contenu de repli, s'il n'y a pas d'enfant passĂ© au slot</p> </slot> <Footer /></div>Le contenu de repli ne sera affichĂ© que lorsquâaucun Ă©lĂ©ment correspondant avec lâattribut slot="name" nâest transmis Ă un slot nommĂ©.
Astro transmet un slot vide lorsquâun Ă©lĂ©ment slot existe, mais quâil nây a pas de contenu Ă transmettre. Le contenu de repli ne peut pas ĂȘtre utilisĂ© par dĂ©faut lorsquâun slot vide est transmis. Le contenu de repli nâest affichĂ© que quand aucun Ă©lĂ©ment slot ne peut ĂȘtre trouvĂ©.
Transférer des slots
Section intitulĂ©e « TransfĂ©rer des slots »Les slots peuvent ĂȘtre transfĂ©rĂ©s Ă dâautres composants. Par exemple, lorsque lâon crĂ©e des mises en page imbriquĂ©es :
------<html lang="fr"> <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} /> <slot name="head" /> </head> <body> <slot /> </body></html>---import BaseLayout from './BaseLayout.astro';---<BaseLayout> <slot name="head" slot="head" /> <slot /></BaseLayout>Les slots nommĂ©s peuvent ĂȘtre transfĂ©rĂ©s vers un autre composant en utilisant les attributs name et slot sur une balise <slot />.
Maintenant, les slots par défaut et head passés à HomeLayout seront transférés au parent BaseLayout.
---import HomeLayout from '../layouts/HomeLayout.astro';---<HomeLayout> <title slot="head">Astro</title> <h1>Astro</h1></HomeLayout>Composants HTML
Section intitulĂ©e « Composants HTML »Astro prend en charge lâimportation et lâutilisation de fichiers .html en tant que composants ou le placement de ces fichiers dans le sous-rĂ©pertoire src/pages en tant que pages. Vous souhaiterez peut-ĂȘtre utiliser des composants HTML si vous rĂ©utilisez le code dâun site existant créé sans framework ou si vous souhaitez vous assurer que votre composant ne possĂšde aucune fonctionnalitĂ© dynamique.
Les composants HTML ne doivent contenir que du code HTML valide et ne disposent donc pas des fonctionnalités clés des composants Astro :
- Ils ne prennent pas en charge le frontmatter, les importations cÎté serveur ou les expressions dynamiques.
- Toutes les balises
<script>sont laissées non regroupées, traitées comme si elles avaient une directiveis:inline. - Ils ne peuvent référencer que les ressources qui se trouvent dans le dossier
public/.
Un Ă©lĂ©ment <slot /> Ă lâintĂ©rieur dâun composant HTML fonctionnera comme il le ferait dans un composant Astro. Pour utiliser lâĂ©lĂ©ment slot des composants web Ă la place, ajoutez is:inline Ă votre Ă©lĂ©ment <slot>.