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

L’API de contexte fournit un mécanisme permettant aux composants de “parler” entre eux sans avoir besoin de faire circuler des données en tant que props, ou de déclencher des évènements à tout va. C’est une fonctionnalité avancée, mais pratique. Dans cet exercice, nous allons recréer Schotter de George Nees — un des pionniers de l’art génératif — en utilisant l’API de contexte.

Dans Canvas.svelte, il y a une fonction addItem qui ajoute un élément au canvas. Nous pouvons la rendre disponible dans les composants au sein de <Canvas>, comme <Square> avec setContext :

Canvas
import { setContext } from 'svelte';
import { SvelteSet } from 'svelte/reactivity';

let { width = 100, height = 100, children } = $props();

let canvas;
let items = new SvelteSet();

setContext('canvas', { addItem });

function addItem(fn) {
	$effect(() => {
		items.add(fn);
		return () => items.delete(fn);
	});
}

Dans les composants enfants, nous pouvons maintenant récupérer le contexte avec, eh bien, getContext :

Square
import { getContext } from 'svelte';

let { x, y, size, rotate } = $props();

getContext('canvas').addItem(draw);

Jusque là... on s’ennuie un peu. Ajoutons un peu d’aléatoire à la grille :

App
<div class="container">
	<Canvas width={800} height={1200}>
		{#each Array(12) as _, c}
			{#each Array(22) as _, r}
				<Square
					x={180 + c * 40 + jitter(r * 2)}
					y={180 + r * 40 + jitter(r * 2)}
					size={40}
					rotate={jitter(r * 0.05)}
				/>
			{/each}
		{/each}
	</Canvas>
</div>

setContext et getContext doivent être appelées pendant l’initialisation du composant, de sorte que le contexte soit correctement lié. La clé — 'canvas' dans notre cas — peut être n’importe quelle valeur, même autre chose que des chaînes de caractères, ce qui peut être utile pour contrôler qui peut accéder au contexte.

Votre objet de contexte peut contenir n’importe quoi, même des états réactifs. Ceci vous permet de passer aux composants enfants des valeurs qui changent au cours du temps :

// dans un composant parent
import { setContext } from 'svelte';

let context = $state({...});
setContext('my-context', context);
// dans un composant enfant
import { getContext } from 'svelte';

const context = getContext('my-context');

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<script>
	import Canvas from './Canvas.svelte';
	import Square from './Square.svelte';
 
	// nous utilisons un générateur de nombre aléatoire avec graine pour obtenir une variabilité
	// consistente
	let seed = 1;
 
	function random() {
		seed *= 16807;
		seed %= 2147483647;
		return (seed - 1) / 2147483646;
	}
 
	function jitter(amount) {
		return amount * (random() - 0.5);
	}
</script>
 
<div class="container">
	<Canvas width={800} height={1200}>
		{#each Array(12) as _, c}
			{#each Array(22) as _, r}
				<Square
					x={180 + c * 40}
					y={180 + r * 40}
					size={40}
				/>
			{/each}
		{/each}
	</Canvas>
</div>
 
<style>
	.container {
		height: 100%;
		aspect-ratio: 2 / 3;
		margin: 0 auto;
		background: rgb(224, 219, 213);
		filter: drop-shadow(0.5em 0.5em 1em rgba(0, 0, 0, 0.1));
	}
</style>