Ръководства · 01

Стойности и стил

Притежавайте стойност в компонент, извеждайте изходи с calc() и изберете къде да се записва CSS променливата.

Притежаване на стойност

useAnimatedValue(initial) създава Value, която принадлежи на компонента. Използвайте число или запис като { x: 0, opacity: 1 }, чиито полета са отделни стойности.

В обикновен style стойността на hook е токенът var(--kkwa-…, initial). Обновяванията записват тази променлива в елементите, които я използват; React не рендерира.

Подготовка на примера…

Извеждане с calc()

Интерполация без easing и add, subtract, multiply или divide с константа стават точни изрази calc() на същата променлива. Браузърът ги извежда; за тях не се изпълнява JavaScript на всеки кадър.

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

Подготовка на примера…

Цветове и собствени изчисления

Цветове, интерполации с easing, modulo, diffClamp и AnimatedComputed не могат да се запишат като calc(). useAnimatedCSS(node) им дава собствена CSS променлива, обновявана от JavaScript, със същия живот като компонента.

Използването на такъв възел директно в style хвърля грешка, така че цената никога не е скрита.

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

Нека hook притежава рецептата

useAnimated(initial, factory, deps) притежава стойността и всеки контролер, деклариран синхронно във factory. Стартира при монтиране, рестартира при промяна на зависимост и спира при демонтиране.

Подайте { autoStart: false } за възпроизвеждане по събития, после извикайте start(), stop() или 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))` }} />;

Един запис за много елементи

По подразбиране променливата получава всеки елемент, чийто вграден стил използва стойността. Със scope променливата се записва веднъж в контейнер и се наследява от децата му: правилният избор за стотици елементи.

AnimatedProvider scope={ref} задава scope по подразбиране за всички стойности на hooks под него.

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

Четене на стойности в JavaScript

getValue() връща моментна снимка, без да абонира React. useAnimatedListener(node, fn) ви извиква при всяка промяна и премахва слушателя при демонтиране. Използвайте го за рисуване в canvas или анализи, не за рендериране.

Търсене

Пишете, за да търсите в документацията.