Gidsen · 01
Waarden en stijl
Bezit een waarde in een component, leid uitvoer af met calc() en kies waar de CSS-variabele wordt geschreven.
Bezit een waarde
useAnimatedValue(initial) maakt een Value die van het component is. Gebruik een getal, of een record zoals { x: 0, opacity: 1 } waarvan de velden aparte waarden zijn.
In een gewone style is een hookwaarde het token var(--kkwa-…, initial). Updates schrijven die variabele op de elementen die hem gebruiken; React rendert niet.
Voorbeeld voorbereiden…
Afleiden met calc()
Een interpolatie zonder easing en add, subtract, multiply of divide met een constante worden exacte calc()-expressies van dezelfde variabele. De browser leidt ze af; er draait per frame geen JavaScript voor.
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})` }} />;Voorbeeld voorbereiden…
Kleuren en eigen berekeningen
Kleuren, interpolaties met easing, modulo, diffClamp en AnimatedComputed kunnen niet als calc() worden geschreven. useAnimatedCSS(node) geeft ze een eigen CSS-variabele, bijgewerkt door JavaScript, met dezelfde levensduur als het component.
Zo'n node direct in style gebruiken gooit een fout, zodat de kosten nooit verborgen zijn.
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 }} />;Laat de hook een recept bezitten
useAnimated(initial, factory, deps) bezit de waarde en elke controller die synchroon in de factory is gedeclareerd. Hij start bij mount, start opnieuw als een afhankelijkheid verandert en stopt bij unmount.
Geef { autoStart: false } mee voor afspelen op events, en roep dan start(), stop() of reset() aan op de teruggegeven waarde.
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))` }} />;Eén keer schrijven voor veel elementen
Standaard krijgt elk element waarvan de inline style de waarde gebruikt de variabele. Met scope wordt de variabele één keer op een container geschreven en door de kinderen geërfd: de juiste keuze voor honderden elementen.
AnimatedProvider scope={ref} stelt een standaardscope in voor elke hookwaarde eronder.
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>;Waarden lezen in JavaScript
getValue() geeft een snapshot terug zonder React te abonneren. useAnimatedListener(node, fn) roept je bij elke wijziging aan en verwijdert de listener bij unmount. Gebruik het voor tekenen op canvas of voor analytics, niet om te renderen.