当前位置: 首页 > news >正文

React Native 弹框组件“失灵” ,一次动画并发问题的排查与修复

在一个基于 Animated 实现的自定义弹框组件 AppActionSheet 中,业务页面触发弹框显示时,出现弹框“出不来”的情况 —— 调用方已将 isShow 设为 true,但 UI 上没有任何反应,且无报错。

首先检查 componentDidUpdate 中的判断逻辑

componentDidUpdate(prevProps) { if (this.props.isShow && !prevProps.isShow) { this.registerBackHandler(); this.show(); } else if (!this.props.isShow && prevProps.isShow) { this.hide(); } }

逻辑本身没有问题:isShow 从 false → true 调用 show(),反之调用 hide()。问题不在这个入口。

查看核心实现:

show = () => { this.setState({ visible: true }); Animated.timing(this.slideAnim, { toValue: 0, duration: 200, useNativeDriver: true, }).start(); }; hide = () => { Animated.timing(this.slideAnim, { toValue: screenHeight, duration: 200, useNativeDriver: true, }).start(() => { this.setState({ visible: false }); this.removeBackHandler(); }); };

hide() 启动了一个 200ms 的滑出动画,并在动画完成回调中将 visible 置为 false。如果在这 200ms 内再次调用 show(),show() 会执行 setState({ visible: true }),但旧的 hide 动画并未被取消。旧动画执行完毕后,其回调会将 visible 再次设为 false,覆盖掉刚刚设置的 true。

方案:在启动新动画前,停止所有正在运行的动画。引入一个标志变量,在动画回调中判断当前“期望”的可见状态,避免过期回调误操作。组件卸载时清理,防止内存泄漏。

最终实现:

export class AppActionSheet extends React.Component { constructor(props) { super(props); this.state = { visible: false }; this.slideAnim = new Animated.Value(screenHeight); this.animation = null; // 保存当前动画实例 this.isVisibleExpected = false; // 期望状态标志 } show = () => { this.isVisibleExpected = true; // 取消正在运行的动画 if (this.animation) { this.animation.stop(); this.animation = null; } this.setState({ visible: true }); this.animation = Animated.timing(this.slideAnim, { toValue: 0, duration: 200, useNativeDriver: true, }); this.animation.start(() => { this.animation = null; }); }; hide = () => { this.isVisibleExpected = false; if (this.animation) { this.animation.stop(); this.animation = null; } this.animation = Animated.timing(this.slideAnim, { toValue: screenHeight, duration: 200, useNativeDriver: true, }); this.animation.start(() => { // 只有期望为 false 时才真正隐藏 if (!this.isVisibleExpected) { this.setState({ visible: false }); this.removeBackHandler(); } this.animation = null; }); }; componentWillUnmount() { // 组件卸载时停止动画 if (this.animation) { this.animation.stop(); this.animation = null; } this.removeBackHandler(); } }

ok.

http://www.jsqmd.com/news/1089267/

相关文章:

  • 【软考积分落户黄金公式】:证书分+年限分+社保倍数=精准预估落户时间,已验证137例真实案例
  • 如何快速使用抖音无水印下载器:3个实用技巧提升下载效率
  • 从零到一:解锁微软、领英与讯飞联袂的AI Prompt工程师认证攻略
  • 如何3步掌握AMD处理器调试:硬件性能调优完整指南
  • 如何打破音乐平台枷锁:Unlock Music Electron让你的加密音乐重获自由
  • DS4Windows终极指南:5步将PlayStation手柄完美适配Windows游戏
  • 终极AMD Ryzen调试指南:SMU Debug Tool的5大核心功能详解
  • 5步终极教程:让老款Mac免费升级最新macOS系统
  • PPTTimer:终极免费PPT计时器,让你的演示时间掌控如呼吸般自然
  • 50.CODESYS/S7-1200 通用|PLC 水箱 PID 闭环控制 + 手自动切换 + 故障保护
  • 推理成本精细化运营:轻任务用低价模型、重逻辑交高配模型的智能路由实践
  • 5分钟快速上手:NucleusCoop终极分屏游戏教程
  • DS4Windows终极指南:3步让PlayStation手柄在Windows上完美重生
  • 免费开源Gerber查看器gerbv:PCB设计验证的终极解决方案
  • 3个OneMore功能彻底改变你的OneNote笔记体验[特殊字符]
  • 3步解锁原神成就管理:YaeAchievement从新手到高手的完整攻略
  • Lenovo Legion Toolkit:终极指南 - 如何完全掌控联想拯救者笔记本性能
  • Windows窗口置顶神器:彻底告别多任务切换烦恼的终极解决方案
  • Windows部署自动化终极指南:5大功能让你轻松绕过硬件限制
  • 软考高级证书=涨薪加速器?(2024人社部薪酬白皮书实证:系统架构师平均年薪突破32.8万)
  • 点云实战指南:PCL可视化交互与多视图应用
  • Cadence Allegro PCB设计88问解析(二十八) 之 Allegro中dimension environment参数详解与标注标准化实践
  • ai饰品模特新趋势,主流图生成平台全景解析
  • EPSON RX8900SA/CE 时钟芯片I2C驱动实战与避坑指南
  • COM3D2 MaidFiddler实时编辑器:5分钟掌握游戏女仆终极定制方案
  • 跨越工具壁垒:Synplify与Vivado协同优化FPGA设计流程实战
  • 终极无损视频剪辑指南:用LosslessCut轻松处理GoPro、无人机素材
  • 从ShuffleNet V1/V2到移动端部署:PyTorch实现与四条黄金准则的实战解析
  • Linux环境下Milvus向量数据库的部署与配置实战
  • 终极指南:免费AMD Ryzen处理器调试工具SMU Debug Tool完整使用教程