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

【react native】ScrollView的触摸事件与TouchableWithoutFeedback的点击事件冲突

需求背景

使用 ScrollView 组件实现轮播图效果,该轮播图可以自动向右滑动。有下面两个需求:

(1)希望用户左右点击的时候,视图可以向左/向右滚动;

(2)希望用户触摸在屏幕的时候,轮播图不自动滚动,放开的时候重新计时5秒后向右滚动;

(3)在轮播视图内有一个按钮,希望我们在点击按钮并弹出弹窗的时候,轮播图停止计时,弹窗关闭后再重新计时。

需求分析

(1)我们可以使用 TouchableWithoutFeedback 组件,分别覆盖左右视图,当触发onPress的时候进行翻页。

(2)可以使用 ScrollViewonTouchStartonTouchEnd 事件,分别表示触摸开始和触摸结束时候的回调。

(3)事件的回调顺序是: onTouchStart > onPress > onTouchEnd ,所以下面的这种写法会导致,当点击share按钮的时候,打印如下:

onTouchStart
click button, start to stop timer
onTouchEnd
// 执行完异步操作后会打印
start to start timer

但我们希望的是,能够打印如下:

onTouchStart
click button, start to stop timer
// onTouchEnd 不打印
// 执行完异步操作后会打印
start to start timer
state = {scrollViewTouchable: true,
};handleSharePress = async() => {// 停止定时器console.log('click button, start to stop timer');this.handleStopTimer();// 处理 "Share" 按钮的逻辑// await ....// 打开定时器console.log('start to start timer');this.handleStartTimer();
};render() {const { scrollViewTouchable } = this.state;return (<View><ScrollViewonTouchStart={scrollViewTouchable ? ()=>{this.handleStartTimer(); console.log('onTouchStart')} : undefined}onTouchEnd={scrollViewTouchable ? ()=>{this.handleStopTimer(); console.log('onTouchEnd')} : undefined}// 其他属性...>{/* ScrollView 内容 */}<TouchableOpacityonPress={this.handleSharePress}><View style={styles.shareButton}>{/* Share 按钮内容 */}</View></TouchableOpacity></ScrollView></View>);
}

解决方法

通过阻止默认事件的方式好像不能解决上述问题,因为 TouchableWithoutFeedback 组件不会阻止事件冒泡到父组件。

所以我们考虑用一个state变量来控制 ScrollView 组件的触摸事件是否可用。在点击 “Share” 按钮时,将状态变量设置为 false,在 onPress 事件完成后,将状态变量设置回 true。

state = {scrollViewTouchable: true,
};handleSharePress = async() => {this.setState({ scrollViewTouchable: false });// 处理 "Share" 按钮的逻辑// await...this.setState({ scrollViewTouchable: true });
};render() {const { scrollViewTouchable } = this.state;return (<View><ScrollViewonTouchStart={scrollViewTouchable ? this.handleStartTimer : undefined}onTouchEnd={scrollViewTouchable ? this.handleStopTimer : undefined}// 其他属性...>{/* ScrollView 内容 */}<TouchableOpacityonPress={this.handleSharePress}><View style={styles.shareButton}>{/* Share 按钮内容 */}</View></TouchableOpacity></ScrollView></View>);
}
http://www.lryc.cn/news/294940.html

相关文章:

  • 鸿蒙内核框架
  • 幻兽帕鲁专用服务器,多人游戏(专用服务器)搭建
  • 7000字详解Spring Boot项目集成RabbitMQ实战以及坑点分析
  • AJAX-认识URL
  • 国图公考:公务员面试资格复审需要准备什么?
  • 爬虫实战--人民网
  • 【Arduino】LGT8F328 UNO R3编译上传
  • Python进阶----在线翻译器(Python3的百度翻译爬虫)
  • ArcGISPro中Python相关命令总结
  • 2024年混合云:趋势和预测
  • c++入门学习④——对象的初始化和清理
  • Java-spring注解的作用
  • Allegro如何把Symbols,shapes,vias,Clines,Cline segs等多种元素一起移动
  • 【力扣】罗马数字转整数,哈希集合+模拟
  • 从长网址到短链接:探索网址缩短的神奇世界
  • Micro micro controller一览
  • 一文简介Maven初级使用
  • Django的配置文件setting.py
  • 2024-02-06(Sqoop)
  • C++ 11新特性之tuple
  • Spring Boot项目整合Seata AT模式
  • 作业2.5
  • LeetCode、790. 多米诺和托米诺平铺【中等,二维DP,可转一维】
  • Python 的 sys 模块常用方法
  • Kafka 使用手册
  • STM32F407移植OpenHarmony笔记7
  • cortexM c语言和汇编嵌套编程
  • 国外传输大文件必选工具
  • Redis渗透SSRF的利用
  • 【深度学习】基于PyTorch架构神经网络学习总结(基础概念基本网络搭建)