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)
上一篇 2022年5月7日 上午10:00
下一篇 2022年5月7日 上午10:00


相关推荐

  • 神经网络可视化工具有哪些_神经网络可视化函数plot

    神经网络可视化工具有哪些_神经网络可视化函数plot1.下载安装Netron下载链接:https://github.com/lutzroeder/netron/releases/tag/v3.5.4安装命令:sudodpkg-inetron_3.5.4_amd64.deb2.使用Netron进行网络可视化首先在终端输入netron命令接着打开基于pytorch的.p…

    2022年10月8日
    6
  • EXITS用法

    EXITS用法语法 EXISTSsubque 参数 subquery 是一个受限的 SELECT 语句 不允许有 COMPUTE 子句和 INTO 关键字 结果类型 Boolean 如果子查询包含行 则返回 TRUE 否则返回 FLASE NOTEXISTS 的作用与 EXISTS 正好相反执行效率 EXISTS 与 IN 使用效率的问题 通常情况下采用 exists 要比 in 效率高 因为 IN 不走索引 但要看实际情况具体使用 IN 适合于外表大而内表小的情况 EXISTS 适合于外表小而内表大的情况

    2026年3月18日
    1
  • Win10图标变白纸了,恢复方法

    Win10电脑桌面图标变成白纸了,恢复步骤第一种方法(此方法失败用第二种)首先开启显示隐藏受保护的系统文件和文件夹的设置。打开计算机,单击【文件】菜单中的【更改文件夹和搜索选项】选项。切换到【查看】选项卡,在【高级设置】选择【显示隐藏的文件、文件夹和驱动器】,然后单击【确定】按钮保存设置,之后关闭。键盘按WIN+R组合键,弹出窗体里键入【%USERPROFILE%\AppData\Local】回车键确定打开的文件夹窗口删除隐藏状态的IconCache.db图标缓存文件,搞定。第二种方法

    2022年4月5日
    3.8K
  • OpenStack八大核心组件精讲之—neutron理论知识

    OpenStack八大核心组件精讲之—neutron理论知识OpenStack八大核心组件精讲之—neutron理论知识一、OpenStack网络二、Linux网络虚拟化(一)、Linux虚拟网桥(二)、虚拟局域网(三)、开发虚拟交换机三、openstack网络基础服务1、neutron网络结构2、网络子网与端口3、网络拓扑类型①、Local②、Flat③、VLAN④、VXLAN⑤、GRE⑥、GENEVE⑦、总结4、网络基本架构5、neutron-server6、Neutron遵循OpenStack的设计原则,采用开放性架构,通过插件.代理与网络提供者的配合来实

    2025年6月11日
    5
  • AIC准则选三个变量的r语言代码

    AIC准则选三个变量的r语言代码setwd(“C:/Users/IBM/Desktop/研一课程/2.2回归分析/回归作业”) #设定当前的工作目录shuju=read.table(“shuju.txt”,header=T)shuju #读取数据#采用AIC原则自动选择模型-前进法library(MASS)stepAIC(lm(y~.,data=shuju[,-1])) #146.

    2022年5月24日
    93
  • maven的热部署

    maven的热部署在tomcat中配置用户权限,即添加管理员帐号 在根目录/conf/tomcat-users.xml 里添加下面的代码 &lt;rolerolename="manager-gui"/&gt;&lt;rolerolename="manager-script"/&gt;&lt;userusername="admin"password="admin"roles="mana

    2022年5月18日
    41

发表回复

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

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