I would recommend writing this as follows:
const previousFooRef = useRef(props.foo);
useEffect(() => {
if (previousFooRef.current !== props.foo) {
animateSomething(ref, props.onAnimationComplete);
previousFooRef.current = props.foo;
}
}, [props.foo, props.onAnimationComplete]);
You can’t avoid the complexity of having a condition inside the effect, because without it you will run your animation on mount rather than just when props.foo
changes. The condition also allows you to avoid animating when things other than props.foo
change.
By including props.onAnimationComplete
in the dependencies array, you avoid disabling the lint rule which helps ensure that you don’t introduce future bugs related to missing dependencies.
Here’s a working example: