Guider · 01

Värden och stil

Äg ett värde i en komponent, härled utdata med calc() och välj var CSS-variabeln skrivs.

Äg ett värde

useAnimatedValue(initial) skapar ett Value som ägs av komponenten. Använd ett tal, eller en post som { x: 0, opacity: 1 } vars fält är separata värden.

I en vanlig style är ett hookvärde token var(--kkwa-…, initial). Uppdateringar skriver den variabeln på de element som använder den; React renderar inte.

Förbereder exemplet…

Härled med calc()

En interpolering utan easing och add, subtract, multiply eller divide med en konstant blir exakta calc()-uttryck av samma variabel. Webbläsaren härleder dem; inget JavaScript körs för dem per bildruta.

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

Förbereder exemplet…

Färger och egna beräkningar

Färger, interpoleringar med easing, modulo, diffClamp och AnimatedComputed kan inte skrivas som calc(). useAnimatedCSS(node) ger dem en egen CSS-variabel, uppdaterad av JavaScript, med samma livstid som komponenten.

Att använda en sådan nod direkt i style kastar ett fel, så kostnaden döljs aldrig.

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

Låt hooken äga ett recept

useAnimated(initial, factory, deps) äger värdet och varje controller som deklareras synkront i factoryn. Den startar vid mount, startar om när ett beroende ändras och stoppar vid unmount.

Skicka { autoStart: false } för händelsestyrd uppspelning och anropa sedan start(), stop() eller reset() på det returnerade värdet.

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 en gång för många element

Som standard får varje element vars inline-style använder värdet variabeln. Med scope skrivs variabeln en gång på en container och ärvs av dess barn: rätt val för hundratals element.

AnimatedProvider scope={ref} sätter ett standard-scope för alla hookvärden 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ärden i JavaScript

getValue() returnerar en ögonblicksbild utan att prenumerera React. useAnimatedListener(node, fn) anropar dig vid varje ändring och tar bort lyssnaren vid unmount. Använd den för att rita på canvas eller för analys, inte för rendering.

Sök

Skriv för att söka i dokumentationen.