Guider · 01

Verdier og stil

Eie en verdi i en komponent, avled utdata med calc() og velg hvor CSS-variabelen skrives.

Eie en verdi

useAnimatedValue(initial) oppretter en Value som komponenten eier. Bruk et tall eller en post som { x: 0, opacity: 1 } der feltene er separate verdier.

I en vanlig style er en hook-verdi tokenet var(--kkwa-…, initial). Oppdateringer skriver den variabelen på elementene som bruker den; React renderer ikke.

Forbereder eksempelet …

Avled med calc()

En interpolasjon uten easing og add, subtract, multiply eller divide med en konstant blir eksakte calc()-uttrykk av den samme variabelen. Nettleseren avleder dem; ingen JavaScript kjører for dem per bilde.

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})` }} />;

Forbereder eksempelet …

Farger og egne beregninger

Farger, interpolasjoner med easing, modulo, diffClamp og AnimatedComputed kan ikke skrives som calc(). useAnimatedCSS(node) gir dem sin egen CSS-variabel, oppdatert av JavaScript, med samme levetid som komponenten.

Å bruke en slik node direkte i style kaster en feil, så kostnaden er aldri skjult.

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 }} />;

La hooken eie en oppskrift

useAnimated(initial, factory, deps) eier verdien og hver kontroller som deklareres synkront i factoryen. Den starter ved mount, starter på nytt når en avhengighet endres, og stopper ved unmount.

Send { autoStart: false } for hendelsesstyrt avspilling, og kall så start(), stop() eller reset() på den returnerte verdien.

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))` }} />;

Skriv én gang for mange elementer

Som standard får hvert element der inline-style bruker verdien, variabelen. Med scope skrives variabelen én gang på en container og arves av barna: riktig valg for hundrevis av elementer.

AnimatedProvider scope={ref} setter et standard-scope for alle hook-verdier under den.

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>;

Les verdier i JavaScript

getValue() returnerer et øyeblikksbilde uten å abonnere React. useAnimatedListener(node, fn) kaller deg ved hver endring og fjerner lytteren ved unmount. Bruk den til tegning på canvas eller analyse, ikke til rendering.

Søk

Skriv for å søke i dokumentasjonen.