Przewodniki · 01

Wartości i style

Posiadaj wartość w komponencie, wyprowadzaj wyjścia przez calc() i wybieraj, gdzie zapisywana jest zmienna CSS.

Posiadaj wartość

useAnimatedValue(initial) tworzy Value należące do komponentu. Użyj liczby albo rekordu takiego jak { x: 0, opacity: 1 }, którego pola są osobnymi wartościami.

W zwykłym style wartość hooka to token var(--kkwa-…, initial). Aktualizacje zapisują tę zmienną w elementach, które jej używają; React nie renderuje.

Przygotowywanie przykładu…

Wyprowadzaj przez calc()

Interpolacja bez easing oraz add, subtract, multiply lub divide przez stałą stają się dokładnymi wyrażeniami calc() tej samej zmiennej. Wylicza je przeglądarka; dla nich nie działa żaden JavaScript w każdej klatce.

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

Przygotowywanie przykładu…

Kolory i własne obliczenia

Kolorów, interpolacji z easing, modulo, diffClamp i AnimatedComputed nie da się zapisać jako calc(). useAnimatedCSS(node) daje im własną zmienną CSS, aktualizowaną przez JavaScript, z tym samym czasem życia komponentu.

Użycie takiego węzła bezpośrednio w style rzuca błąd, więc koszt nigdy nie jest ukryty.

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

Niech hook posiada przepis

useAnimated(initial, factory, deps) posiada wartość i każdy kontroler zadeklarowany synchronicznie w fabryce. Startuje przy montażu, startuje ponownie, gdy zmienia się zależność, i zatrzymuje się przy odmontowaniu.

Przekaż { autoStart: false }, by odtwarzać na zdarzenia, a potem wywołuj start(), stop() lub reset() na zwróconej wartości.

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

Zapisz raz dla wielu elementów

Domyślnie zmienną dostaje każdy element, którego styl inline używa wartości. Z scope zmienna jest zapisywana raz w kontenerze i dziedziczona przez dzieci: właściwy wybór dla setek elementów.

AnimatedProvider scope={ref} ustawia domyślny zakres dla każdej wartości hooka poniżej.

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

Odczytuj wartości w kodzie JavaScript

getValue() zwraca migawkę bez subskrybowania React. useAnimatedListener(node, fn) wywołuje cię przy każdej zmianie i usuwa słuchacza przy odmontowaniu. Używaj go do rysowania na canvas lub analityki, nie do renderowania.

Szukaj

Zacznij pisać, aby przeszukać dokumentację.