Průvodci · 01

Hodnoty a styl

Vlastněte hodnotu v komponentě, odvozujte výstupy přes calc() a zvolte, kam se zapisuje proměnná CSS.

Vlastnictví hodnoty

useAnimatedValue(initial) vytvoří Value, kterou vlastní komponenta. Použijte číslo nebo záznam jako { x: 0, opacity: 1 }, jehož pole jsou samostatné hodnoty.

V běžném style je hodnota hooku token var(--kkwa-…, initial). Aktualizace zapisují tuto proměnnou na prvky, které ji používají; React nerenderuje.

Příprava příkladu…

Odvození přes calc()

Interpolace bez easing a add, subtract, multiply nebo divide konstantou se stávají přesnými výrazy calc() téže proměnné. Odvozuje je prohlížeč; JavaScript pro ně v každém snímku neběží.

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

Příprava příkladu…

Barvy a vlastní výpočty

Barvy, interpolace s easing, modulo, diffClamp a AnimatedComputed nejde zapsat jako calc(). useAnimatedCSS(node) jim dá vlastní proměnnou CSS aktualizovanou JavaScriptem, se stejnou dobou života jako komponenta.

Použití takového uzlu přímo ve style vyhodí chybu, takže náklady nikdy nejsou 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 }} />;

Nechte recept vlastnit hook

useAnimated(initial, factory, deps) vlastní hodnotu a každý controller deklarovaný synchronně ve factory. Spustí se při připojení, znovu se spustí při změně závislosti a při odpojení se zastaví.

Pro přehrávání řízené událostmi předejte { autoStart: false } a pak na vrácené hodnotě volejte start(), stop() nebo 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))` }} />;

Zapsat jednou pro mnoho prvků

Ve výchozím stavu dostane proměnnou každý prvek, jehož inline styl hodnotu používá. Se scope se proměnná zapíše jednou na kontejner a jeho potomci ji zdědí: správná volba pro stovky prvků.

AnimatedProvider scope={ref} nastaví výchozí scope pro všechny hodnoty hooků 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>;

Čtení hodnot v JavaScriptu

getValue() vrátí snímek bez přihlášení Reactu k odběru. useAnimatedListener(node, fn) vás zavolá při každé změně a při odpojení posluchače odebere. Používejte ho pro kreslení do canvas nebo analytiku, ne pro renderování.

Hledat

Pište a hledejte v dokumentaci.