Cours Svelte et SvelteKit · Module 2: Composants
Imbrication de composants
Dans cette leçon3
Tout comme Yggdrasil a des branches, et celles-ci ont de plus petites brindilles, les composants Svelte peuvent contenir d'autres composants.
Exemple : Structure d'un village viking
VikingVillage (root)
├── TownHall
│ ├── ChiefRoom
│ └── MeetingHall
├── Barracks
│ ├── Warrior
│ ├── Warrior
│ └── Warrior
├── Blacksmith
│ └── Forge
└── Harbor
├── Ship
└── ShipImplémentation
<!-- VikingVillage.svelte -->
<script>
import TownHall from './TownHall.svelte';
import Barracks from './Barracks.svelte';
import Blacksmith from './Blacksmith.svelte';
import Harbor from './Harbor.svelte';
let villageName = 'Svenheim';
</script>
<div class="village">
<h1>Village : {villageName}</h1>
<TownHall />
<Barracks />
<Blacksmith />
<Harbor />
</div>
<style>
.village {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
padding: 2rem;
}
</style><!-- Barracks.svelte -->
<script>
import Warrior from './Warrior.svelte';
let warriors = ['Ragnar', 'Bjorn', 'Ivar', 'Ubbe'];
</script>
<div class="barracks">
<h2>Caserne</h2>
{#each warriors as name}
<Warrior {name} />
{/each}
</div><Warrior {name} /> est un raccourci pour <Warrior name={name} />. Le composant Warrior reçoit cette valeur avec la rune $props() :
<!-- Warrior.svelte -->
<script>
let { name } = $props();
</script>
<div class="warrior">
<span class="icon">ᛏ</span>
<span class="name">{name}</span>
</div>
<style>
.warrior {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem;
background: #3d2914;
border-radius: 4px;
margin: 0.25rem 0;
}
</style>Bonnes pratiques pour l'imbrication
- Un composant = une responsabilité
- Ne pas imbriquer trop profondément (3-4 niveaux max)
- Extrais les éléments répétitifs dans des composants séparés
- Nomme les composants clairement - selon ce qu'ils font, pas selon leur apparence
Code de cette leçon : App.svelte
<script>
// Nesting components - like branches of Yggdrasil
import VikingVillage from './VikingVillage.svelte';
</script>
<VikingVillage name="Kattegat" />
<style>
:global(body) {
margin: 0;
background: #0a0a0a;
}
</style>Entrées de la documentation utilisées dans cette leçon
Tu as repéré une erreur dans cette leçon ?
Teste tes connaissances
Réponds aux questions de cette leçon. Choisis une réponse pour voir tout de suite si elle est correcte.
1. Comment importer un composant du répertoire src/lib via l'alias dans SvelteKit 3 ?
Tâches pratiques dans le jeu
- Éditeur de code
Complète le code en important le composant Warrior et en l'utilisant dans le markup