Skip to main content
Bases de Svelte
Introduction
Réactivité
Props
Logique
Évènements
Liaisons
Classes et styles
Actions
Transitions
Svelte avancé
Réactivité avancée
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
Routes d’API
$app/state
Erreurs et redirections
SvelteKit avancé
Hooks
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) :

AudioPlayer
<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 :

AudioPlayer
<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

précédent suivant
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<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>