Comment utiliser les machines à sous dans Svelte



Svelte propose plusieurs méthodes pour orchestrer la communication entre les composants, notamment via des propriétés (props), des emplacements (slots), et d’autres mécanismes. L’intégration des emplacements est essentielle pour concevoir des composants modulaires, flexibles et réutilisables dans vos applications Svelte.

Exploration du concept des emplacements dans Svelte

Les emplacements, ou « slots » dans le contexte de Svelte, partagent une philosophie similaire à celle des slots de Vue. Ils offrent une méthode pour transmettre dynamiquement du contenu depuis un composant parent vers un composant enfant. Grâce aux slots, il est possible de définir des zones réservées dans la structure d’un composant, dans lesquelles du contenu peut être injecté depuis un composant supérieur.

Ce contenu peut se présenter sous forme de texte simple, de balisage HTML élaboré, ou même d’autres composants Svelte. L’utilisation judicieuse des slots vous ouvre la porte à la création de composants extrêmement personnalisables et dynamiques, qui s’adaptent à une variété de cas d’utilisation.

Mise en œuvre d’un emplacement de base

Pour mettre en place un emplacement dans Svelte, l’élément `slot` est utilisé au sein du modèle d’un composant. Cet élément agit comme un marqueur pour le contenu qui sera fourni par le composant parent. Par défaut, le slot affichera tout contenu qui lui est transmis.

Voici un exemple illustrant la création d’un slot de base :

 <main>
Ceci est le composant enfant
<slot></slot>
</main>

Ce fragment de code met en évidence un composant enfant qui utilise l’élément `slot` pour recevoir du contenu d’un composant parent.

Pour injecter du contenu d’un composant parent à un enfant, il est d’abord nécessaire d’importer le composant enfant dans le parent. Ensuite, au lieu de recourir à une balise autofermante pour afficher le composant enfant, une balise ouvrante et fermante est utilisée. Le contenu à transférer du parent vers l’enfant est inséré entre les balises du composant enfant.

Par exemple:

 <script>
import Component from "./Component.svelte";
</script>

<main>
Ceci est le composant parent
<Component>
<span>Ceci est un message du composant parent</span>
</Component>
</main>

Outre la transmission de contenu, il est possible de fournir un contenu de secours par défaut dans les emplacements. Ce contenu est affiché par le slot lorsque le composant parent ne fournit pas de contenu spécifique.

Voici comment définir un contenu de secours :

 <main>
Ceci est le composant enfant
<slot>Contenu par défaut</slot>
</main>

Ce code fait en sorte que le texte « Contenu par défaut » soit affiché par l’emplacement si le composant parent ne fournit aucun contenu.

Transmission de données via les emplacements avec les accessoires de slot

Svelte permet la transmission de données aux emplacements via des accessoires de slot (slot props). L’utilisation de ces accessoires est pertinente lorsque vous souhaitez transférer des données du composant enfant vers le contenu injecté.

Par exemple:

 <script>
let message="Bonjour, composant parent !"
</script>

<main>
Ceci est le composant enfant
<slot message={message}></slot>
</main>

Ce fragment de code représente un composant Svelte. La variable `message` est déclarée dans la balise `script` et initialisée avec le texte « Bonjour, composant parent ! ». Cette variable est également transmise via l’accessoire `message` du slot, rendant les données disponibles au composant parent lorsqu’il injecte du contenu dans cet emplacement.

 <script>
import Component from "./Component.svelte";
</script>

<main>
Ceci est le composant parent
<Component let:message>
<div>
Le composant enfant dit : {message}
</div>
</Component>
</main>

La syntaxe `let:message` permet au composant parent d’accéder à l’accessoire `message` fourni par l’enfant. La variable `message` dans la balise `div` correspond aux données de l’accessoire de slot.

Il est important de noter qu’il n’y a pas de limite à un seul accessoire de slot. Il est possible de transmettre plusieurs accessoires si nécessaire :

 <script>
let user = {
firstName: 'Jean',
lastName: 'Dupont'
};
</script>

<main>
Ceci est le composant enfant
<slot firstName={user.firstName} lastName={user.lastName}></slot>
</main>

Dans le composant parent :

 <script>
import Component from "./Component.svelte";
</script>

<main>
Ceci est le composant parent
<Component let:firstName let:lastName>
<div>
Le nom de l'utilisateur est {firstName} {lastName}
</div>
</Component>
</main>

Manipulation des emplacements nommés

Les emplacements nommés deviennent utiles lorsque vous souhaitez gérer plusieurs points d’injection de contenu dans vos composants. Ils simplifient la gestion en attribuant un nom unique à chaque emplacement, ce qui facilite la création de mises en page complexes.

Pour créer un emplacement nommé, il suffit d’ajouter un accessoire `name` à l’élément `slot` :

 <div>
Ceci est le composant enfant

<p>En-tête : <slot name="header"></slot></p>
<p>Pied de page : <slot name="footer"></slot></p>
</div>

Dans cet exemple, deux emplacements nommés sont définis : « header » et « footer ». La propriété `slot` permet de transférer du contenu spécifique à chacun de ces emplacements depuis le composant parent.

Par exemple:

 <script>
import Component from "./Component.svelte";
</script>

<main>
Ceci est le composant parent
<Component>
<span slot="header">Ceci sera transmis au slot d'en-tête</span>
<span slot="footer">Ceci sera transmis au slot de pied de page</span>
</Component>
</main>

Ce code illustre l’utilisation de la propriété `slot` pour injecter du contenu dans des emplacements nommés. L’accessoire `slot` avec la valeur `header` positionne le texte dans l’emplacement d’en-tête, tandis que la valeur `footer` le positionne dans l’emplacement de pied de page.

Comprendre la transmission d’emplacements

La transmission d’emplacements (slot forwarding) est une fonctionnalité de Svelte qui permet de relayer le contenu d’un composant parent à travers un composant intermédiaire (wrapper) vers un composant enfant. Cette technique s’avère très utile dans les situations où vous souhaitez injecter du contenu à travers plusieurs niveaux de composants.

Voici un exemple de mise en œuvre du slot forwarding. Commençons par la création du composant enfant :

 <main>
Ceci est le composant enfant
<slot name="message"></slot>
</main>

Ensuite, nous créons le composant intermédiaire (wrapper) :

 <script>
import Component from "./Component.svelte";
</script>

<main>
<Component>
<div slot="message">
<slot name="wrapperMessage"></slot>
</div>
</Component>
</main>

Dans ce code, un autre emplacement nommé est transmis dans l’emplacement `message` du composant enfant.

Enfin, dans le composant parent, le code suivant est utilisé :

 <script>
import Wrapper from "./Wrapper.svelte";
</script>

<main>
Ceci est le composant parent
<Wrapper>
<div slot="wrapperMessage">
Ceci provient du composant parent
</div>
</Wrapper>
</main>

Dans cette architecture, le contenu « Ceci provient du composant parent » est transmis via le composant `Wrapper` directement au composant enfant grâce à l’emplacement `wrapperMessage` défini à l’intérieur du composant `Wrapper`.

Simplifiez votre développement avec les emplacements Svelte

Les emplacements sont une fonctionnalité puissante de Svelte qui permet de concevoir des composants personnalisables et réutilisables. Vous avez exploré la création d’emplacements de base, d’emplacements nommés, l’utilisation d’accessoires de slot et la transmission d’emplacements. En maîtrisant ces différents types d’emplacements et leur utilisation, vous serez en mesure de créer des interfaces utilisateur flexibles et dynamiques.