Guide · 01
Valori e stile
Possiedi un valore in un componente, ricava output con calc() e scegli dove viene scritta la variabile CSS.
Possiedi un valore
useAnimatedValue(initial) crea un Value che appartiene al componente. Usa un numero, oppure un record come { x: 0, opacity: 1 } i cui campi sono valori separati.
In un normale style, il valore di un hook è il token var(--kkwa-…, initial). Gli aggiornamenti scrivono quella variabile sugli elementi che la usano; React non si renderizza.
Preparazione dell’esempio…
Ricava con calc()
Un’interpolazione senza easing e add, subtract, multiply o divide per una costante diventano espressioni calc() esatte della stessa variabile. Le ricava il browser; per loro non viene eseguito JavaScript a ogni frame.
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})` }} />;Preparazione dell’esempio…
Colori e calcoli personalizzati
Colori, interpolazioni con easing, modulo, diffClamp e AnimatedComputed non si possono scrivere come calc(). useAnimatedCSS(node) dà loro una variabile CSS propria, aggiornata da JavaScript, con la stessa vita del componente.
Usare un nodo del genere direttamente in style lancia un errore, così il costo non è mai nascosto.
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 }} />;Lascia che l’hook possieda una ricetta
useAnimated(initial, factory, deps) possiede il valore e ogni controller dichiarato in modo sincrono nella factory. Parte al montaggio, riparte quando cambia una dipendenza e si ferma allo smontaggio.
Passa { autoStart: false } per una riproduzione guidata dagli eventi, poi chiama start(), stop() o reset() sul valore restituito.
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))` }} />;Scrivi una volta per molti elementi
Di default, ogni elemento il cui style inline usa il valore riceve la variabile. Con scope, la variabile viene scritta una volta su un contenitore ed ereditata dai figli: la scelta giusta per centinaia di elementi.
AnimatedProvider scope={ref} imposta uno scope predefinito per tutti i valori degli hook al suo interno.
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>;Leggi i valori in JavaScript
getValue() restituisce un’istantanea senza iscrivere React. useAnimatedListener(node, fn) ti chiama a ogni modifica e rimuove il listener allo smontaggio. Usalo per disegnare su canvas o per le analytics, non per il rendering.