Reanimated中如何让动画在组件卸载前完成? 令狐子轩 提问于 2026-03-18 10:00:19 阅读 23 移动 我用Reanimated做了一个下拉菜单的关闭动画,但一点击关闭就立刻unmount组件,动画根本没机会执行完。试过加runOnJS延迟卸载也不行,有啥靠谱的办法吗? 这是我的简化代码: const opacity = useSharedValue(1); const handleClose = () => { opacity.value = withTiming(0, { duration: 300 }, () => { // 这里想等动画结束再卸载组件,但父组件收不到信号 }); }; 我来解答 赞 8 收藏 分享 生成中... 手机扫码查看 复制链接 生成海报 反馈 发表解答 您需要先 登录/注册 才能发表解答 1 条解答 司马俊蓓 Lv1 这个问题很简单,动画完成后通过回调通知父组件卸载就行。 你代码里 withTiming 第三个参数就是动画结束回调,在那里通知父组件: // 子组件 const AnimatedView = Animated.createAnimatedComponent(View); const Menu = ({ onClose }) => { const opacity = useSharedValue(1); const handleClose = () => { opacity.value = withTiming(0, { duration: 300 }, (finished) => { if (finished) { onClose(); // 动画完成后再通知父组件卸载 } }); }; const animatedStyle = useAnimatedStyle(() => ({ opacity: opacity.value, })); return ( <AnimatedView style={animatedStyle}> <TouchableOpacity onPress={handleClose} /> </AnimatedView> ); }; // 父组件 const [menuVisible, setMenuVisible] = useState(true); return ( <> {menuVisible && ( <Menu onClose={() => setMenuVisible(false)} /> )} </> ); 关键点就是条件渲染 {menuVisible && },点击关闭时先播动画,动画完再 setMenuVisible(false) 触发真正卸载。 如果你用的是 Modal 或者 Portal,也可以把 visible 属性传进去让父组件控制卸载时机。 回复 点赞 2026-03-18 11:01 加载更多 相关推荐 2 回答 116 浏览 Reanimated动画在组件卸载时如何正确清理? 我在用Reanimated 2实现按钮悬停缩放动画时遇到问题,当点击按钮跳转页面时动画突然中断,页面闪了一下。尝试在useEffect的清理函数里调用stopAnimation,但报错说animate... 技术诗诗 移动 2026-01-29 12:55:32 1 回答 80 浏览 Reanimated的ScrollView下拉动画卡顿怎么解决? 我在用Reanimated 2实现下拉刷新动画时,滑动特别卡顿,控制台还报Jank警告。代码都用useSharedValue和interpolate了,但手指松开后动画还是不流畅。 这是我的核心代码片... Des.涵菲 移动 2026-01-28 17:43:29 1 回答 23 浏览 Reanimated中useAnimatedStyle不生效是怎么回事? 我在用React Native的Reanimated做动画,写了个useAnimatedStyle想控制一个View的translateY,但完全没反应。试过把sharedValue的值直接写死也不动... 小玉娟 移动 2026-03-16 14:39:20 1 回答 28 浏览 Reanimated 的 withTiming 回调不执行是怎么回事? 我用 Reanimated 2 做一个动画,想在动画结束后执行点逻辑,但传给 withTiming 的回调根本没触发,这是为啥? 我试过把回调写成第二个参数,也检查了 shared value 的值确... 程序员丽苹 移动 2026-03-15 11:44:20 2 回答 44 浏览 Reanimated中useAnimatedStyle不生效是怎么回事? 我在用Reanimated做列表项滑动删除动画,但useAnimatedStyle返回的样式完全没反应,元素还是静止不动。 试过把translateX直接写死成100,也无效。控制台也没报错,共享值o... Dev · 博潇 移动 2026-03-05 21:10:19 1 回答 46 浏览 Reanimated 2和3的版本差异导致的报错怎么解决? 我在升级Reanimated到v3后,使用Value时一直报“Cannot read property 'Value' of undefined”,但文档里写v3还支持v2语法 场景是给按钮添加缩放动... 轩辕鑫玉 移动 2026-02-12 15:08:27 1 回答 48 浏览 Framer Motion组件卸载时动画突然中断怎么办? 在用Framer Motion做页面切换动画时遇到个怪问题,当快速切换路由导致组件被卸载时,退出动画会突然中断,直接消失而不是完成整个过渡效果... 已经试过用exitBeforeEnter和cust... Mr.玲玲 组件 2026-02-09 10:33:29 2 回答 68 浏览 SWR在React组件卸载时如何取消未完成的请求? 我在用SWR获取用户数据时,发现组件卸载后还在发起请求,控制台报错说"Can't cancel mutate..."。我试过在useEffect的清理函数里调用mutate.cancel,但好像没生效... ♫熙妍 框架 2026-01-29 11:10:30 2 回答 35 浏览 React组件卸载时如何正确清理多个useEffect订阅? 最近在做聊天功能时,一个组件同时订阅了WebSocket和API轮询,但发现组件卸载后依然在接收消息。我尝试在cleanup函数里写取消订阅的逻辑,但遇到变量作用域问题,控制台报错说"unsubscr... 诸葛照涵 优化 2026-02-18 22:32:27 2 回答 205 浏览 页面切换动画组件如何实现平滑过渡?元素位置跳动问题怎么解决? 我在用Vue的Transition组件做路由切换动画时,新页面元素总会出现0.5秒的跳动。已经给容器加了固定宽高,但当使用transform: translateX()动画时,内容区域还是会有位置偏移... 司空栾同 组件 2026-02-04 01:49:28
你代码里
withTiming第三个参数就是动画结束回调,在那里通知父组件:关键点就是条件渲染
{menuVisible && },点击关闭时先播动画,动画完再setMenuVisible(false)触发真正卸载。如果你用的是 Modal 或者 Portal,也可以把 visible 属性传进去让父组件控制卸载时机。