Guides · 01
Valeurs et style
Gérer une valeur dans un composant, dériver des sorties avec calc() et choisir où la variable CSS est écrite.
Gérer une valeur
useAnimatedValue(initial) crée une Value qui appartient au composant. Utilisez un nombre, ou un enregistrement comme { x: 0, opacity: 1 } dont chaque champ est une valeur distincte.
Dans un style ordinaire, une valeur de hook est le jeton var(--kkwa-…, initial). Les mises à jour écrivent cette variable sur les éléments qui l’utilisent ; React ne se rend pas.
Préparation de l’exemple…
Dériver avec calc()
Une interpolation sans easing et add, subtract, multiply ou divide par une constante deviennent des expressions calc() exactes de la même variable. Le navigateur les calcule ; aucun JavaScript ne s’exécute pour elles à chaque image.
const progress = useAnimatedValue(0);
// A linear interpolation of a hook value is a calc() of the same CSS variable.
const x = progress.interpolate({ inputRange: [0, 1], outputRange: ['0px', '180px'] });
const half = multiply(progress, 0.5);
<div style={{ opacity: half, transform: `translateX(${x})` }} />;Préparation de l’exemple…
Couleurs et calculs personnalisés
Les couleurs, les interpolations avec easing, modulo, diffClamp et AnimatedComputed ne peuvent pas s’écrire en calc(). useAnimatedCSS(node) leur donne leur propre variable CSS, mise à jour par JavaScript, avec la même durée de vie que le composant.
Utiliser un tel nœud directement dans style lève une erreur : le coût n’est jamais caché.
const progress = useAnimatedValue(0);
// Colors and eased curves are not calc() expressions: give them their own CSS value.
const color = useAnimatedCSS(
progress.interpolate({ inputRange: [0, 1], outputRange: ['#3d3bf3', '#22b8f0'] }),
);
<div style={{ background: color }} />;Confier une recette au hook
useAnimated(initial, factory, deps) gère la valeur et chaque contrôleur déclaré de façon synchrone dans la factory. Elle démarre au montage, redémarre quand une dépendance change et s’arrête au démontage.
Passez { autoStart: false } pour une lecture déclenchée par un événement, puis appelez start(), stop() ou reset() sur la valeur renvoyée.
const intro = useAnimated(
{ opacity: 0, y: 24 },
(value) => {
parallel([
timing(value.opacity, { toValue: 1, duration: 400 }),
spring(value.y, { toValue: 0, stiffness: 220, damping: 20 }),
]);
},
[],
);
<section style={{ opacity: intro.opacity, transform: `translateY(calc(${intro.y} * 1px))` }} />;Écrire une fois pour de nombreux éléments
Par défaut, chaque élément dont le style en ligne utilise la valeur reçoit la variable. Avec scope, la variable est écrite une fois sur un conteneur et héritée par ses enfants : le bon choix pour des centaines d’éléments.
AnimatedProvider scope={ref} définit un scope par défaut pour toutes les valeurs de hook en dessous.
const field = useRef(null);
// Written once on the field; every child that uses the value inherits it.
const wave = useAnimatedValue(0, { scope: field });
<div ref={field}>
{items.map((item) => (
<i key={item} style={{ transform: `rotate(calc(${wave} * 1turn))` }} />
))}
</div>;Lire les valeurs en JavaScript
getValue() renvoie un instantané sans abonner React. useAnimatedListener(node, fn) vous appelle à chaque changement et retire le listener au démontage. Servez-vous-en pour dessiner dans un canvas ou pour des statistiques, pas pour le rendu.