1. 程式人生 > >react-navigation重複點選多次跳轉的解決方案

react-navigation重複點選多次跳轉的解決方案

廢話

  • [email protected]版本之後,官方廢棄了之前的導航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的官方文件

本文結束,歡迎大家加群共同學習

QQ群:672509442
這裡寫圖片描述

相關推薦

react-navigation重複解決方案

廢話 在[email protected]版本之後,官方廢棄了之前的導航Navigator,用react-navigation 替代 react-natvigation於2017年1月份開源,在3個月時間內,GitHub上star數達4000+,備

react-navigation 連續

問題描述,關於react-navigation 導航庫在快速連續點選的時候,葉面會發生多次跳轉,初次遇到這個坑爹的問題時,一臉懵逼,看過原始碼,幾經折騰終於弄明白了是咋會兒事兒 問題出現的原因: node_modules/react-navigation/src/NavigationAc

iOS 防止UITableViewCell快速重複響應事件

專案中多次用到UITableView,didSelectRowAtIndexPath在機器卡頓情況下可以多次點選觸發事件,為了防止這種情況發生,可以在基類裡新增一個bool型別的屬性selected,

RxAndroid防止按鈕短時間內被重複

匯入依賴 compile ‘io.reactivex:rxandroid:1.2.1’ compile ‘io.reactivex:rxjava:1.1.6’ 新增許可權 //獲得寫sd卡的許可權 <uses-permission

微信小程式頁面解決方法

在使用小程式的時候會出現這樣一種情況:當網路條件差或卡頓的情況下,使用者會認為點選無效而進行多次點選,最後出現多次跳轉頁面的情況,這個問題可以通過JS中的函式節流和函式防抖找到解決方法。根據官方文件介紹,函式節流就是規定一個單位時間,在這個單位時間內,只能有一次觸發事件的回撥

微信小程式navigator無反應

今天在弄微信小程式的時候使用到navigator元件實現跳轉出現了一個問題就是我點選我設定的button然後用navigator巢狀進去,當沒點選一次button就可以跳轉到相應的介面,當我重複四次的時候問題出現了,不管我怎麼點選也不會跳轉,最後還是通過百度找到了解決方案。 【程式碼展示】

React Native TouchableOpacity 封裝 防止快速 響應

不耽誤幹活,直接上程式碼,功能比較簡單,具體延時時間自己定,還需要啥功能自己改進一下。 import React,{ Component } from "react"; import {Touch

側滑(條目進行+更換頭像(二取樣))+ViewPager

1.Layout佈局 <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk

C#button僅生成一個窗體(單例模式)

優化基本的單例模式 Form1 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; us

如何實現在當前jsp頁面中通過按鈕來到上一個訪問的頁面

1.問題來源場景介紹: 列表頁展示: 新增專案頁面展示: 在專案列表展示頁面中,點選”新增“按鈕,可以跳轉到新建專案頁面.當新增頁面只能從指定某一個列表展示頁面中跳轉過來時,只需要在返回按鈕對應的超連結地址中寫明專案列表展示頁的訪問路徑既可實現跳轉

jquery中click事件巢狀後觸發的解決方案

首先講講我遇到這個問題的時候,我最開始想到的是阻止事件冒泡,想了一下好像沒有什麼關係的,最後決定還是動手做做看,放到專案中試了試確實是沒有什麼關係的,傻眼了怎麼辦,來講講我的親身體驗吧! 產生此種小姑的原因:jQuery中的click事件會累計繫結,所以我們可以在下次點

UITableViewCell.selected方法被呼叫的解決方案

PS:自打使用了self-manager的設計模式.跳轉控制器變得方便多了. 某天.更新Xcode之後發現一個BUG.就是點選Cell之後方法執行兩遍.WTF? - (void)setSelected:(BOOL)selected animate

防止快速調節音量按鈕呼叫網路介面

private Runnable reqeustSetVoice; public void setDeviceVoice(final int count, BindBean bean, ImageButton deviceVoice) {

檔案,到wps瀏覽

當檔案下載完畢之後,需要進行瀏覽,有兩種方式: 1:使用TBS,即騰訊瀏覽服務,點選開啟連結 2:使用wps,由於專案受制於網路,故使用第二種方式實現,程式碼如下 public class WpsFileUtils { private static boolean isInstall

微信小程式——商品分類到該商品的商品詳情頁面(已實現)

        首先,我不得不感慨下,慕課網上“7七月”老師的課真的很強大,此處放連結https://coding.imooc.com/learn/list/75.html。        我只是學習到了一半就開

關於百度推送通知,的問題(Android)

      今天在跟同事測試百度推送,之前一直困擾我的一個問題得到了有效解決,挺高興的,所以記錄一下,同時告誡自己,遇到問題,解決解決再解決,一定能夠解決的!      切入正題,百度推送的demo跟我們的app有些不一樣

外部連結App指定頁面SingleTask模式

1.上一篇講到如何點選外部連結跳轉app的方法,經過測試,當開啟App的時候,點選連結時候會重新開啟一個新的App程序,如果你想從原來的開啟APP跳進去,那麼使用SingleTask模式配合android:taskAffinity屬性一起使用.    如果單獨使用Single

web端 - 返回上一步,返回,上個頁面 JS

1.方法一: <script language="javascript" type="text/javascript"> window.location.href="login.jsp?backurl="+window.location.href; </script>

window location href導致a標籤中的onclick失效

我們通過window.location.href來多次跳轉一個介面的時候可能會出現a標籤的失效,可以通過 <a  href="javascript:history.go(-1);" >返回

讓wordpress日誌標題到外部連結實現

    Wordpress實現點選文章標題跳轉到外部連結的方法,有時候出於某些目的的需要,需要在wordpress部落格中實現點選文章標題不直接跳轉轉到文章頁面,而跳轉到外部連結的效果。不過WordP