Bases de Svelte
Introduction
Liaisons
Classes et styles
Svelte avancé
Réutiliser du contenu
Mouvements
Liaisons avancées
Transitions avancées
API de contexte
Éléments spéciaux
<script module>
Next steps
Bases de SvelteKit
Introduction
Routing
Chargement de données
En-têtes et cookies
Modules partagés
Formulaires
$app/state
Erreurs et redirections
SvelteKit avancé
Options de page
Options de lien
Routing avancé
Chargement avancé
Variables d’environnement
Conclusion
Dans tous les exemples que nous avons vu jusqu’ici, le bloc <script>
contenait du code qui était
exécuté lorsque chaque instance de composant est initialisée. Pour la grande majorité des
composants, vous n’avez pas besoin de plus.
Très occasionnellement, vous aurez besoin d’exécuter du code en dehors d’une instance individuelle d’un composant. Par exemple, si on revient sur notre player audio personnalisé qu’on a vu dans un exercice précédent, il est possible de jouer les quatres pistes en même temps. Il serait plus pratique que la lecture d’une piste arrête toutes les autres.
Nous pouvons faire ça en déclarant un bloc <script module>
. Le code contenu à l’intérieur ne sera
joué qu’une seule fois, la première fois que le module est évalué, plutôt que lorsqu’un composant
est instantié. Mettez le code suivant tout en haut de AudioPlayer.svelte
(notez qu’il s’agit d’une
balise script distincte) :
<script module>
let current;
</script>
Il est maintenant possible pour les instances de composant de “discuter” entre elles sans aucune gestion d’état particulière :
<audio
src={src}
bind:currentTime={time}
bind:duration
bind:paused
onplay={(e) => {
const audio = e.currentTarget;
if (audio !== current) {
current?.pause();
current = audio;
}
}}
onended={() => {
time = 0;
}}
/>
Modifier cette page sur Github
<script>
import AudioPlayer from './AudioPlayer.svelte';
import { tracks } from './tracks.js';
</script>
<div class="centered">
{#each tracks as track}
<AudioPlayer {...track} />
{/each}
</div>
<style>
.centered {
display: flex;
flex-direction: column;
height: 100%;
justify-content: center;
gap: 0.5em;
max-width: 40em;
margin: 0 auto;
}
</style>