Reanimated中useAnimatedStyle不生效是怎么回事?
我在用Reanimated做列表项滑动删除动画,但useAnimatedStyle返回的样式完全没反应,元素还是静止不动。
试过把translateX直接写死成100,也无效。控制台也没报错,共享值offset打印出来是有变化的。
代码结构大概是这样:
const offset = useSharedValue(0);
const animatedStyle = useAnimatedStyle(() => {
return {
transform: [{ translateX: offset.value }]
};
});
// 在JSX里用了 <Animated.View style={[styles.item, animatedStyle]} />
第一步,确认你的babel配置。在babel.config.js里必须有这行:
没这个的话useAnimatedStyle就是个摆设。记得要重启metro服务,光重载应用不行。
第二步,检查你的入口文件。很多人忘记在App.tsx/jsx顶部加这个:
第三步,确保你的手势处理器正确更新了offset值。比如这样:
原理是这样的:Reanimated通过这个babel插件把动画逻辑移到UI线程,不配置的话动画代码其实根本没执行,虽然控制台能打印出值变化。
补充个常见坑:如果你用expo,记得sdk版本要≥41,低版本Reanimated2支持有问题。我已经被这个坑熬过夜了...
最后测试下这个最小示例能跑通不:
如果还不行,八成是RN版本兼容问题,可以试试把reanimated降级到2.3.1,这个版本比较稳。
先检查babel.config.js里有没有这行:
然后建议改成这样测试:
1. 确保你从reanimated2导入:
import Animated from 'react-native-reanimated'而不是react-native自带的那个
2. 试试给手势加个简单监听:
如果还不行,清空metro缓存重启:
npx react-native start --reset-cache我上次被这坑了一下午,结果发现是新项目忘记配babel插件...(捂脸)