Reanimated动画在组件卸载时如何正确清理?
我在用Reanimated 2实现按钮悬停缩放动画时遇到问题,当点击按钮跳转页面时动画突然中断,页面闪了一下。尝试在useEffect的清理函数里调用stopAnimation,但报错说animatedValue不是共享值。这是我的代码:
import { Animated, useSharedValue, useAnimatedReaction } from 'react-native-reanimated';
const Button = () => {
const scale = useSharedValue(1);
useAnimatedReaction(
() => scale.value,
(newScale) => {
Animated.spring(scale, { toValue: newScale }).start();
}
);
useEffect(() => {
return () => {
scale.stopAnimation(); // 这里报错
};
}, []);
return (
点击跳转
);
};
查文档说要用useAnimatedProps,但不确定怎么改才能让动画在组件卸载时平滑停止。有没有更好的清理方式?
stopAnimation确实不能直接用在useSharedValue上,因为它是针对旧版动画系统的 API。这里给你一个正确的解决方法。一般这样处理:用
withTiming或withSpring来代替Animated.spring,并且通过runOnJS来确保清理函数在 JS 环境中执行。另外,你可以直接在useEffect的清理函数里重置scale.value,这样就能避免动画突然中断的问题。以下是修改后的代码:
重点是:
1. 使用
withSpring替代旧的Animated.spring。2. 在
useEffect清理函数里通过runOnJS安全地重置scale.value。3. 不要用
stopAnimation,它已经过时了。这样改之后,动画会在组件卸载时平滑停止,不会有闪屏或报错问题。试试看吧!