博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
react-navigation重复点击多次跳转的解决方案
阅读量:4069 次
发布时间:2019-05-25

本文共 2833 字,大约阅读时间需要 9 分钟。

废话

  • 在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属性
this.repeatClick(this.props.navigation)}>
goto detail page
...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
( navigation: NavigationProp
): NavigationScreenProp { /* ------------此处为添加的代码--------- */ 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事件无需再加控制

this.props.navigation.navigate('Detail')}>
goto detail page
  1. 看效果
    03.gif

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

地址:,欢迎访问

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

QQ群:672509442

这里写图片描述

你可能感兴趣的文章
Encoding Schemes
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Java8 HashMap集合解析
查看>>
自定义 select 下拉框 多选插件
查看>>
gdb 调试core dump
查看>>
gdb debug tips
查看>>
linux和windows内存布局验证
查看>>
忽略图片透明区域的事件(Flex)
查看>>
移动端自动化测试-Mac-IOS-Appium环境搭建
查看>>
Selenium之前世今生
查看>>
Selenium-WebDriverApi接口详解
查看>>
Selenium-ActionChains Api接口详解
查看>>
Selenium-Switch与SelectApi接口详解
查看>>
Selenium-Css Selector使用方法
查看>>
Linux常用统计命令之wc
查看>>
PHP那点小事--三元运算符
查看>>
fastcgi_param 详解
查看>>
学习python(1)——环境与常识
查看>>
学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域
查看>>
一文看清HBase的使用场景
查看>>