With the react-spring library, we can render animations in our React app easily.
In this article, we’ll take a look at how to get started with react-spring.
useSprings
The useSprings hook lets us create multiple springs each with its own config.
For example, we can write:
import React from "react";
import { animated, useSprings } from "react-spring";
const items = [
  { text: "foo", opacity: 0.3, id: 1 },
  { text: "bar", opacity: 0.6, id: 2 },
  { text: "baz", opacity: 0.9, id: 3 }
];
export default function App() {
  const springs = useSprings(
    items.length,
    items.map((item) => ({ opacity: item.opacity, from: { opacity: 0 } }))
  );
  return (
    <>
      {springs.map((props, i) => (
        <animated.div style={props} key={i}>
          {items[i].text}
        </animated.div>
      ))}
    </>
  );
}
to create the animation styles for each item with the useSprings hook.
The first argument is the number of style objects to create.
The 2nd argument is an array with the styles we want to apply.
Then in the JSX, we apply the styles by passing in the props to the style prop.
We can also control our animation with the set and stop functions.
For example, we can write:
import React from "react";
import { animated, useSprings } from "react-spring";
const items = [
  { text: "foo", opacity: 0.3, id: 1 },
  { text: "bar", opacity: 0.6, id: 2 },
  { text: "baz", opacity: 0.9, id: 3 }
];
export default function App() {
  const [springs, set, stop] = useSprings(items.length, (index) => ({
    opacity: items[index].opacity,
    from: { opacity: 0 }
  }));
  return (
    <>
      <button onClick={() => set((index) => ({ opacity: 1 }))}>start</button>
      <button onClick={() => stop()}>stop</button>
      {springs.map((props, i) => (
        <animated.div style={props} key={i}>
          {items[i].text}
        </animated.div>
      ))}
    </>
  );
}
We have the same items array.
And we use the useSpring hook with a function as the 2nd argument instead of an array of styles.
Calling it with a function as the 2nd argument will give us the set and stop functions in addition to springs ,
The set function lets us run the animation with the given style.
And the stop function lets us stop the animation.
Then we display the animated divs the same way.
useTrail
The useTrail lets us create multiple springs with a single config.
For example, we can write:
import React from "react";
import { animated, useTrail } from "react-spring";
const items = [
  { text: "foo", id: 1 },
  { text: "bar", id: 2 },
  { text: "baz", id: 3 }
];
export default function App() {
  const trail = useTrail(items.length, { opacity: 1, from: { opacity: 0 } });
  return (
    <>
      {trail.map((props, i) => (
        <animated.div style={props} key={i}>
          {items[i].text}
        </animated.div>
      ))}
    </>
  );
}
The first argument is the number of animation style objects to create.
And the 2nd argument is the animation style to create.
Then we can apply them as we do with the useSprings hook.
Conclusion
We can create animations for a group of components with the useSprings and useTrail hooks.
