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.
useChain
The useChain
hook lets us render one transition after the other.
For example, we can write:
import React, { useRef, useState } from "react";
import {
useTransition,
animated,
useChain,
useSpring,
useTrail
} from "react-spring";
export default function App() {
const [on, toggle] = useState(false);
const springRef = useRef();
const spring = useSpring({
ref: springRef,
from: { opacity: 0.5 },
to: { opacity: on ? 1 : 0.5 },
config: { tension: 250 }
});
const trailRef = useRef();
const trail = useTrail(5, {
ref: trailRef,
from: { fontSize: "10px" },
to: { fontSize: on ? "35px" : "10px" }
});
useChain(on ? [springRef, trailRef] : [trailRef, springRef]);
return (
<div>
{trail.map((animation, index) => (
<animated.div style={{ ...animation, ...spring }} key={index}>
Hello World
</animated.div>
))}
<button onClick={() => toggle(!on)}>toggle</button>
</div>
);
}
to animate the toggling of the size of the ‘Hello World’ text.
We create the on
state with the toggle
function to toggle the on
state.
Then we create a ref with the useRef
hook and create a transition with the useSpring
hook.
We set the ref
property to the springRef
so we can use that in the useChain
hook.
Likewise, we use the useTrail
to create the 2nd transition.
Then we use th useChain
hook to create the 2 animations combined together.
Their order depends on the value of the on
state.
Then we render the Hello World text by calling the trail.map
method to apply the styles for each stage of the animation.
Now when we click ‘toggle’, we see the Hello World text size change.
Render Props API
The react-spring library comes with a render props API.
To use this to create animations, we use the Spring
component.
For example, we can write:
import React from "react";
import { Spring } from "react-spring/renderprops";
export default function App() {
return (
<div>
<Spring from={{ opacity: 0 }} to={{ opacity: 1 }}>
{(props) => <div style={props}>hello</div>}
</Spring>
</div>
);
}
to add the Spring
component.
We set the from
prop to add the styles to apply at the start of the animation.
And we add the to
prop to add the styles to apply at the end of the animation.
And in the render prop, we pass in a function with the content that we want to render.
The props
parameter has the styles that are applied at each stage of the animation, so we pass that into the style
prop to apply them.
Also, we can animate numbers by writing:
import React from "react";
import { Spring } from "react-spring/renderprops";
export default function App() {
return (
<div>
<Spring from={{ number: 0 }} to={{ number: 1 }}>
{(props) => <div>{props.number}</div>}
</Spring>
</div>
);
}
We set the number
to display at the beginning and the end of the animation with the from
and to
props respectively.
Then we the number animate from 0 to 1.
Conclusion
We can use the useChain
hook to chain animations.
And we can use the Spring
component to render animations.