С помощью библиотеки response-motion мы можем легко визуализировать анимацию в нашем приложении React.

В этой статье мы рассмотрим, как начать работу с реактивным движением.

Начиная

Мы можем установить пакет, запустив:

npm install --save react-motion

Движение

Компонент Motion позволяет нам создавать анимацию с помощью функции замедления по нашему выбору.

Например, мы можем написать:

import React, { useState } from "react";
import { Motion, spring } from "react-motion";
export default function App() {
  const [click, setClick] = useState(false);
  return (
    <>
      <button onClick={() => setClick(!click)}>toggle</button>
      <Motion defaultStyle={{ x: 0 }} style={{ x: spring(click ? 30 : 0) }}>
        {({ x }) => (
          <div
            style={{
              transform: `translateX(${x}px)`
            }}
          >
            hello world
          </div>
        )}
      </Motion>
    </>
  );
}

чтобы переместить div, когда мы нажимаем на кнопку переключения.

Компонент Motion обертывает элементы, которые мы хотим анимировать.

Опора defaultStyle имеет стили по умолчанию.

И свойство style компонента Motion имеет стиль, который применяется при анимации.

Затем мы можем получить значение x в опоре рендеринга и затем использовать его в нашем контенте.

Функция spring отображает значение x, которое применяется при запуске анимации.

Мы можем анимировать более одного стиля.

Например, мы можем написать:

import React, { useState } from "react";
import { Motion, spring } from "react-motion";
export default function App() {
  return (
    <>
      <Motion
        defaultStyle={{ x: 0, y: 0 }}
        style={{ x: spring(10), y: spring(20) }}
      >
        {({ x, y }) => (
          <div
            style={{
              transform: `translateX(${x}px) translateY(${y}px)`
            }}
          >
            hello world
          </div>
        )}
      </Motion>
    </>
  );
}

для анимации значений x и y и использования их с div.

В шахматном порядке

Компонент StaggeredMotion анимирует коллекцию фиксированной длины, значения которой зависят друг от друга.

Чтобы использовать это, мы можем написать:

import React from "react";
import { spring, StaggeredMotion } from "react-motion";
export default function App() {
  return (
    <>
      <StaggeredMotion
        defaultStyles={[{ h: 0 }, { h: 0 }, { h: 0 }]}
        styles={(prevInterpolatedStyles) =>
          prevInterpolatedStyles.map((_, i) => {
            return i === 0
              ? { h: spring(100) }
              : { h: spring(prevInterpolatedStyles[i - 1].h) };
          })
        }
      >
        {(interpolatingStyles) => (
          <div>
            {interpolatingStyles.map((style, i) => (
              <div key={i} style={{ border: "1px solid", height: style.h }} />
            ))}
          </div>
        )}
      </StaggeredMotion>
    </>
  );
}

чтобы создать 3 блока, которые накладываются друг на друга.

Высота каждого из них анимирована, так что их высота увеличивается до 100 пикселей каждый.

Мы передаем массив в опору defaultStyles, чтобы установить начальные стили для каждого div,

Затем в опоре styles мы создаем функцию для получения ранее интерполированных стилей из параметра.

Затем мы возвращаем объект со стилем высоты для анимации в зависимости от индекса анимированного элемента.

В опоре рендеринга мы получаем interpolatingStyles и применяем их к div.

Заключение

Мы можем создавать простые анимации с помощью библиотеки react-motion.