Guides · 01

Værdier og stil

Ej en værdi i en komponent, afled output med calc(), og vælg, hvor CSS-variablen skrives.

Ej en værdi

useAnimatedValue(initial) opretter en Value, som komponenten ejer. Brug et tal eller en post som { x: 0, opacity: 1 }, hvis felter er separate værdier.

I en almindelig style er en hook-værdi tokenet var(--kkwa-…, initial). Opdateringer skriver den variabel på de elementer, der bruger den; React renderer ikke.

Forbereder eksemplet…

Afled med calc()

En interpolation uden easing og add, subtract, multiply eller divide med en konstant bliver eksakte calc()-udtryk af den samme variabel. Browseren afleder dem; der kører intet JavaScript for dem pr. frame.

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 eksemplet…

Farver og egne beregninger

Farver, interpolationer med easing, modulo, diffClamp og AnimatedComputed kan ikke skrives som calc(). useAnimatedCSS(node) giver dem deres egen CSS-variabel, opdateret af JavaScript, med samme levetid som komponenten.

At bruge sådan en node direkte i style kaster en fejl, så omkostningen aldrig er 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 }} />;

Lad hooken eje en opskrift

useAnimated(initial, factory, deps) ejer værdien og hver controller, der erklæres synkront i factoryen. Den starter ved mount, genstarter, når en afhængighed ændrer sig, og stopper ved unmount.

Giv { autoStart: false } for afspilning styret af events, og kald derefter start(), stop() eller reset() på den returnerede værdi.

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 til mange elementer

Som standard får hvert element, hvis inline-style bruger værdien, variablen. Med scope skrives variablen én gang på en container og arves af dens børn: det rette valg til hundredvis af elementer.

AnimatedProvider scope={ref} sætter et standard-scope for alle hook-værdier 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>;

Læs værdier i JavaScript

getValue() returnerer et snapshot uden at abonnere React. useAnimatedListener(node, fn) kalder dig ved hver ændring og fjerner listeneren ved unmount. Brug den til at tegne på canvas eller til analyse, ikke til rendering.

Søg

Skriv for at søge i dokumentationen.