Руководства · 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 }] } }} />;

Поиск

Начните вводить, чтобы искать в документации.