天天看點

React-Native中禁用Navigator手勢傳回

參考:http://blog.csdn.net/pz789as/article/details/52606635

在React-Native開發中,經常會用到導航。導航做什麼用的呢,簡單點說就是頁面跳轉。

一個項目中,肯定有很多的頁面要跳來跳去的,RN就給我們提供了Navigator元件,可以很好的管理頁面的跳轉。

在所有工作做完之後,發現有個bug!在從第一個界面跳轉到下一個界面後,如果從螢幕左邊向右滑,或者從上面想下滑,你會發現一個神奇的事情,那就是頁面會通過滑動而傳回到上一個界面。這讓我們很尴尬了,本來打算禁止跳轉傳回的,或者傳回時還要做些什麼處理的,結果啥都沒做,直接傳回,可以說,這個功能有點适得其反了。

于是為了解決這個問題,到處找答案,官網沒有說,論壇也沒人回答。于是放置了很久很久,沒想到在今天的而然查找下,終于找到解決方案了。

方案主要分三種:

1,自己定義個configureScene:

const NoBackSwipe = {
  ...Navigator.SceneConfigs.HorizontalSwipeJump,
    gestures: {
      pop: {}
    }
};
           

然後在Navigator标簽下使用

<Navigator 
      initialRoute={{Component:'xxx', name:'xxx', index:0, configure: NoBackSwipe}}
      renderScene={this.renderScene.bind(this)}
      configureScene={(route,routeStack)=>{
        return NoBackSwipe
      }}
    />
           

這裡主要是處理了pop,其中還有jumpback,jumpforward的

2,如果你都不要傳回處理的,直接将gestures都改成{}或者null

configureScene(route, routeStack){
    let configure = Navigator.SceneConfigs.PushFromRight;
    switch(route.configure){
      case Consts.FloatFromLeft:
        configure = Navigator.SceneConfigs.FloatFromLeft;
        break;
      case Consts.FloatFromBottom:
        configure = Navigator.SceneConfigs.FloatFromBottom;
        break;
    }
    return {
      ...configure,
      gestures:{}//或者改成null
    };
  }
           

然後使用也是一樣:

<Navigator initialRoute={{Component:'xxx', name:'xxx', index:0, configure: NoBackSwipe}}
        configureScene={this.configureScene.bind(this)}
        renderScene={this.renderScene.bind(this)}
        onStartShouldSetResponder={()=>false}/>
           

我就是用的第二種。

3,還有一種,是直接改源碼,在項目目錄下找到路徑:

/node_modules/react-native/Libraries/CustomComponents/Navigator/Navigator.js

裡面有一段代碼,去掉pop就可以了

var GESTURE_ACTIONS = [
  'pop',//把這個去掉就可以了
  'jumpBack',
  'jumpForward',
];
           

這種直接修改源碼的不推薦使用,因為每當你要更新RN或者做其他調整時,重新下載下傳下來又得改,還是上面兩種比較靠譜。

以上就是今天的大發現,終于解決滑動傳回的問題了~

資料參考:How to disable back swipe gesture in react native navigator