react-navigation重复点击多次跳转的解决方案

react-navigation重复点击多次跳转的解决方案废话在react-native@0.44版本之后,官方废弃了之前的导航Navigator,用react-navigation替代react-natvigation于2017年1月份开源,在3个月时间内,GitHub上star数达4000+,备受推崇,由于其性能体验堪比原生,而且使用方便,最后被FB钦点为“御用导航”但是在使用过程中还是发现了一个问题:在触发页面跳转的View上重复、快

大家好,又见面了,我是你们的朋友全栈君。

废话

  • 在react-native@0.44版本之后,官方废弃了之前的导航Navigator,用react-navigation 替代
  • react-natvigation于2017年1月份开源,在3个月时间内,GitHub上star数达4000+,备受推崇,由于其性能体验堪比原生,而且使用方便,最后被FB钦点为“御用导航”
  • 但是在使用过程中还是发现了一个问题:在触发页面跳转的View上 重复、快速点击时,即将被加载的页面会多次被加载(感谢测试小姐姐丧心病狂的操作),症状如下图
    01.gif

分析问题

经过观察发现,在onPress事件执行后会触发navigation.navigate(...)方法,加载新的页面。
但是当页面加载缓慢时,多余的点击会多次触发该事件,导致页面重复加载
看源码
位置:../node_modules/react-navigation/src/addNavigationHelper.js

...... navigate: ( routeName: string, params?: NavigationParams, action?: NavigationNavigateAction ): boolean => navigation.dispatch( NavigationActions.navigate({ routeName, params, action }) ), .....

显然,页面跳转时,并未对事件进行控制,只要触发,就会加载新的页面

解决方案

既然源码未加控制,我们就手动加上,目前思路有2种
普通版onPress事件处控制,第一次点击后,加上延时,禁止之后的点击操作,但是需要每个点击事件都添加
进阶版 直接修改源码,给navigation.dispatch加延时,一劳永逸

普通版

  1. constructor中初始化一个记录是否等待的state
constructor(props) { super(props) this.state = { waiting: false,//防止多次重复点击 } }
  1. 利用this.state.waiting控制TouchableOpacitydisabled属性
<TouchableOpacity
    disabled={
  
  this.state.waiting}
    onPress={
  
  () => this.repeatClick(this.props.navigation)}
>
    <Text style={
  
  {
  
  padding: 10, color: 'red'}}>goto detail page</Text>
</TouchableOpacity>
...
repeatClick(navigation){
    this.setState({
  
  waiting: true});
    /*-------这中间写你需要实现的逻辑------------*/
    navigation.navigate('Detail')
    /*-------这中间写你需要实现的逻辑------------*/
    setTimeout(()=> { this.setState({waiting: false}) }, 3000);//设置的时间间隔根据实际需要 }
  1. 效果展示
    03.gif

进阶版

  1. 修改源码
    位于:../node_modules/react-navigation/src/addNavigationHelper.js
    此次修改基于"react-navigation": "^1.0.0-beta.27"
    修改后的代码如下:
......
......
export default function<S: {}>(
  navigation: NavigationProp<S>
): NavigationScreenProp<S> {
  /* ------------此处为添加的代码--------- */
  let debounce = true;// 定义判断变量 
  /* ------------此处为添加的代码--------- */
  return {
    ...navigation,
    goBack: (key?: ?string): boolean => {
      let actualizedKey: ?string = key;
      if (key === undefined && navigation.state.key) {
        invariant(
          typeof navigation.state.key === 'string',
          'key should be a string'
        );
        actualizedKey = navigation.state.key;
      }
      return navigation.dispatch(
        NavigationActions.back({ key: actualizedKey })
      );
    },
    navigate: (
      routeName: string,
      params?: NavigationParams,
      action?: NavigationNavigateAction
  /* ------------此处为修改后的的代码--------- */
    ): boolean =>{
      if (debounce) {
        debounce = false;
        navigation.dispatch(
          NavigationActions.navigate({
            routeName,
            params,
            action,
          }),
        );
        setTimeout(
          () => {
            debounce = true;
          },
          5000,
        );
        return true;
      }
      return false;
    },
  /* ------------此处为修改后的的代码--------- */
......
......

此时onPress事件无需再加控制

<TouchableOpacity  // disabled={this.state.waiting} onPress={() => this.props.navigation.navigate('Detail')} > <Text style={ 
   { 
   padding: 10, color: 'red'}}>goto detail page</Text> </T
  1. 看效果
    03.gif

本人翻译了 react-navigation的官方文档

地址:https://www.reactnavigation.org.cn/,欢迎访问

本文结束,欢迎大家加群共同学习

QQ群:672509442
这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/139144.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 详谈利用系统漏洞及mysql提权

    详谈利用系统漏洞及mysql提权提权,顾名思义就是提升权限,当我们getshell⼀个⽹站之后,⼤部分情况下我们的权限是⾮常低的,这时就需要利⽤提权,让原本的低权限(如只允许列⽬录)→⾼权限(拥有修改⽂件的能⼒),权限提升后,对接下来的渗透有很⼤帮助

    2022年7月27日
    9
  • python进制转换代码_十进制转二进制编程

    python进制转换代码_十进制转二进制编程这篇文章主要介绍了Python实现的十进制小数与二进制小数相互转换功能,结合具体实例形式详细分析了二进制与十进制相互转换的原理及Python相关实现技巧,需要的朋友可以参考下本文实例讲述了Python实现的十进制小数与二进制小数相互转换功能。分享给大家供大家参考,具体如下:十进制小数⇒二进制小数乘2取整对十进制小数乘2得到的整数部分和小数部分,整数部分即是相应的二进制数码,再用2乘小数部分(之…

    2022年9月24日
    6
  • 五分钟免费获得自己的永久域名,免费!永久!

    五分钟免费获得自己的永久域名,免费!永久!一分钟教你免费获得自己的域名,由于是免费的,所以可能过程较慢。过程很简单,如果有什么步骤不会可以联系我哦:jenson_97@163.com一、首先进入到Ngrok官网点击右上角的注册,获得账号后登录到该网站进去。二、进入左侧功能栏的隧道管理->开通隧道,选择一个免费的服务器点击购买即可。三、填写基本信息填完基本信息之后点击确定添加,页面跳转之后点击确定开通。四、开通成功之后点击隧道管理就可以看到自己注册的域名了。五、再次进入到Ngrok官网首页,点击客户端下载(选择自己的系统的对

    2022年5月2日
    741
  • Origin绘图快速上手指南

    Origin绘图快速上手指南1、创建工程打开origin后,点击菜单栏“文件”,选择“项目另存为”,给项目命名,并存到某个工作路径。2、导入数据然后将excel中的数据(只要数据)选中后复制到Book1中,从第5行开始粘贴。可以在侧面打开“项目管理器”,给表格“Book1”重命名为“曲线数据”。还可以在表格的“长单位”处给每列数据加上标签。3、那么这时可以直接使用Origin的自动绘图功能了。选择A、B、C所有列,然后点击菜单栏的“绘图”,选择一个折线图,双击即可绘图。这样呢就是将两条曲线放到同一张图中了。如果想要自定

    2022年5月31日
    55
  • 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。[通俗易懂]

    关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。[通俗易懂]环境:景安快云服务器(听说很垃圾,但是公司买的,我也刚来),CentOS6.8x86_64,Apache,MySQL5.1,PHP5.3.问题:现公司有一个php系统,需要重复向后台发送ajax

    2022年8月2日
    9
  • 手把手教你做一个安卓点餐系统

    手把手教你做一个安卓点餐系统撸一个安卓系统……

    2022年6月19日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号