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.

Slide.jsx
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.

Glow.jsx
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.

Intro.jsx
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.

Field.jsx
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.

Zoeken

Typ om de documentatie te doorzoeken.