Sprievodcovia · 01

Hodnoty a štýl

Vlastnite hodnotu v komponente, odvodzujte výstupy cez calc() a zvoľte, kam sa zapisuje premenná CSS.

Vlastníctvo hodnoty

useAnimatedValue(initial) vytvorí Value, ktorú vlastní komponent. Použite číslo alebo záznam ako { x: 0, opacity: 1 }, ktorého polia sú samostatné hodnoty.

V bežnom style je hodnota hooku token var(--kkwa-…, initial). Aktualizácie zapisujú túto premennú na prvky, ktoré ju používajú; React nerenderuje.

Príprava príkladu…

Odvodenie cez calc()

Interpolácia bez easing a add, subtract, multiply alebo divide konštantou sa stávajú presnými výrazmi calc() tej istej premennej. Odvodzuje ich prehliadač; JavaScript pre ne v každej snímke nebeží.

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

Príprava príkladu…

Farby a vlastné výpočty

Farby, interpolácie s easing, modulo, diffClamp a AnimatedComputed nemožno zapísať ako calc(). useAnimatedCSS(node) im dá vlastnú premennú CSS aktualizovanú JavaScriptom, s rovnakou životnosťou ako komponent.

Použitie takého uzla priamo v style vyhodí chybu, takže náklady nikdy nie sú skryté.

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

Nechajte recept vlastniť hook

useAnimated(initial, factory, deps) vlastní hodnotu a každý controller deklarovaný synchrónne vo factory. Spustí sa pri pripojení, znova sa spustí pri zmene závislosti a pri odpojení sa zastaví.

Pre prehrávanie riadené udalosťami odovzdajte { autoStart: false } a potom na vrátenej hodnote volajte start(), stop() alebo reset().

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

Zapísať raz pre mnoho prvkov

Predvolene dostane premennú každý prvok, ktorého inline štýl hodnotu používa. So scope sa premenná zapíše raz na kontajner a jeho potomkovia ju zdedia: správna voľba pre stovky prvkov.

AnimatedProvider scope={ref} nastaví predvolený scope pre všetky hodnoty hookov pod ním.

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

Čítanie hodnôt v JavaScripte

getValue() vráti snímku bez prihlásenia Reactu na odber. useAnimatedListener(node, fn) vás zavolá pri každej zmene a pri odpojení poslucháča odoberie. Používajte ho na kreslenie do canvas alebo analytiku, nie na renderovanie.

Hľadať

Píšte a hľadajte v dokumentácii.