I'm trying to add a rotation to an element when clicked. Each time I want to click on the element the element should rotate. I'm rotating the element using CSS transform property. Bellow is my styled component:
const IconButtonWrapper = styled.div`
transform: rotate(0deg);
overflow: hidden;
transition: all 0.3s ease-out;
${({ rotate }) => rotate && `transform: rotate(360deg)`};
`;
And I have the React component that renders the element and has the onClick
event:
const IconButtonContainer = () => {
const [rotate, setRotate] = useState(false);
const handleClick = () =>
setRotate(
(prevState) => ({ rotate: !prevState.rotate }),
() => console.log(this.state.rotate)
);
return (
<IconButtonWrapper rotate={rotate} onClick={handleClick}>
<IconButton />
</IconButtonWrapper>
);
};
When I click the first time everything works as expected, but when I click the second time, doesn't work anymore. I feel I should return to default state rotate: false
after the transition, but how do I do that in styled components?
Here is a link to a working Sandbox
Technically rotate
is already a boolean so prevState
should be a boolean as well. Also you were trying to set an object to the rotate
state value instead of a simple boolean.
Based on that you only need to negate prevState
and not prevState.rotate
as:
setRotate(prevState => !prevState)
See the code modification from !prevState.rotate
to !prevState
.
Also suggested read is Using the State Hook. It's a bit different than class components.