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 les exercices précédents, nous avons vu que l’état est profondément réactif — si (par exemple) vous changez une propriété d’un objet, ou ajoutez un élément dans un tableau, cela provoquera la mise à jour de l’interface. Ceci fonctionne en créant un proxy qui intercepte les lectures et écritures.
Parfois, ce n’est pas ce que vous souhaitez. Si vous ne changez pas les propriétés individuelles, ou s’il est important de maintenir l’égalité de référence, vous pouvez alors utiliser un état brut (raw state) à la place.
Dans cet exemple, nous avons un graphique montrant le cours de l’action Svelte augmentant doucement
mais sûrement. Nous voulons que le graphique se mette à jour lorsque de nouvelles données arrivent,
ce que nous pouvons faire en transformant data
en état...
let data = $state(poll());
... mais il n’y a pas besoin de le rendre profondément réactif alors qu’il sera entièrement réécrit
quelques millisecondes plus tard. À la place, nous pouvons utiliser $state.raw
:
let data = $state.raw(poll());
Muter un état brut n’aura aucun effet direct. En général, muter un état non réactif est fortement déconseillé
Modifier cette page sur Github
<script>
import { scale } from './utils.js';
import { poll } from './data.js';
let data = poll();
let w = $state(1);
let h = $state(1);
const min = $derived(Math.min(...data) - 5);
const max = $derived(Math.max(...data) + 5);
const x = $derived(scale([0, data.length], [0, w]));
const y = $derived(scale([min, max], [h, 0]));
const ticks = $derived.by(() => {
const result = [];
let n = 10 * Math.ceil(min / 10);
while (n < max) {
result.push(n);
n += 10;
}
return result;
});
$effect(() => {
const interval = setInterval(() => {
data = poll();
}, 200);
return () => {
clearInterval(interval);
};
});
</script>
<div class="outer">
<svg width={w} height={h} bind:clientWidth={w} bind:clientHeight={h}>
<line y1={h} y2={h} x2={w} />
{#each ticks as tick}
<g class="tick" transform="translate(0,{y(tick)})">
<line x2={w} />
<text x={-5}>{tick}</text>
</g>
{/each}
<polyline points={data.map((d, i) => [x(i), y(d)]).join(' ')} />
<text x={10} y={10} font-size={36}>$SVLT</text>
</svg>
</div>
<style>
.outer {
width: 100%;
height: 100%;
padding: 2em;
box-sizing: border-box;
}
svg {
width: 100%;
height: 100%;
overflow: visible;
}
polyline {
fill: none;
stroke: #ff3e00;
stroke-width: 2;
stroke-linejoin: round;
stroke-linecap: round;
}
line {
stroke: #aaa;
}
.tick {
stroke-dasharray: 2 2;
text {
text-anchor: end;
dominant-baseline: middle;
}
}
</style>