Посібники · 03

Компоненти Animated

Рендеріть звичайні елементи, які рухаються до цілі, відповідають на жести й гарно йдуть.

Animated.<tag>

Animated.div, Animated.button, Animated.svg і будь-який інший тег HTML чи SVG рендерять звичайний елемент без обгортки. Їхній style приймає значення, а трансформації можуть бути масивами, як у React Native.

Скінченний рух transform і opacity на цих елементах, зокрема пружини, може відтворюватися браузером.

Підготовка прикладу…

seed, pose, poses і tempo

seed — перший кадр, pose — поточна ціль (об’єкт або назва запису в poses), а tempo — timing чи пружина. Зміна самого лише tempo не відтворює заново незмінну ціль.

onRest спрацьовує, коли елемент прибуває.

Card.jsx
<Animated.article
  seed={{ opacity: 0, transform: [{ translateY: 16 }] }}
  pose={selected ? 'raised' : 'rest'}
  poses={{
    rest: { opacity: 1, transform: [{ translateY: 0 }, { scale: 1 }] },
    raised: { opacity: 1, transform: [{ translateY: -8 }, { scale: 1.04 }] },
  }}
  tempo={{ spring: { stiffness: 300, damping: 26 } }}
  onRest={() => console.log('arrived')}
/>;

Відповідь на жести

respond зіставляє жестам тимчасові цілі: hover, focus, focusWithin, press, longPress, drag, inView та інші. Коли відповідь закінчується, елемент повертається до своєї пози звідти, де він є.

onResponse повідомляє про початок і кінець кожної відповіді, а respond={{ press: {} }} стежить за жестом, нічого не змінюючи візуально.

Підготовка прикладу…

Спільні налаштування через Animated.Scope

Animated.Scope передає назву пози, темп і типові налаштування анімації елементам Animated усередині себе.

Menu.jsx
<Animated.Scope tempo={{ spring: { stiffness: 380, damping: 30 } }}>
  <Animated.li pose={{ opacity: 1 }} />
  <Animated.li pose={{ opacity: 1 }} />
</Animated.Scope>;

Ваші власні компоненти

Animated.wrap(Component) — createAnimatedComponent у React Native — дає змогу компоненту, що прокидає ref і зводиться до одного DOM-елемента, приймати ті самі props.

Link.jsx
import { forwardRef } from 'react';
import { Animated } from '@kkwaenggwari/animated';

const Link = forwardRef((props, ref) => <a ref={ref} {...props} />);
const AnimatedLink = Animated.wrap(Link);

<AnimatedLink href="/pricing" respond={{ hover: { transform: [{ translateX: 4 }] } }} />;

Пошук

Почніть вводити, щоб шукати в документації.