react navigation返回到任意頁面(不整合redux)

來源:互聯網
上載者:User

react navigation預設是使用key作為goback的參數進行返回的,這個key是一個動態產生的,而不是我們定義的routeName。
網上也有很多方法有的說更改源碼,有的說是整合redux。更改源碼的方式我也嘗試過但是如果開啟滑動返回屬性,很容易就卡死。整合redux是一個不錯的方式,但對於新手來說redux的模式還是太過於複雜,況且redux的強大在於資料流的控制,僅僅一個因為一個返回就去學一個這麼大的架構,也太耗時了。
今天我們不藉助任何第三方架構,不修改源碼,也是可以做到,返回任意介面的。
方案一(NEW 推薦):
“react-navigation”: “^1.5.11”版本中發現頁面navigationOptions中列印的navigation是全域的而在頁面中通過this.props.navigation中列印的是當前頁面的navigation。因此我們可以利用這個全域的navigation然後擷取到全域的路由棧。

    static Navigation_routers;    static navigationOptions = {        header:({navigation}) =>{            return <Header navigation = {navigation}                           centerTxt = {'標題'}                           renderRightView = {()=>{                               return <TouchableOpacity activeOpacity={1} onPress={() => {                                   let {state:{routes}} =  navigation;                                   console.log('RealNameIdentification navigation',navigation)                                   console.log('routes',routes);                                   Navigation_routers = routes;//儲存全域的路由                                   let goToLogin = routes[routes.length-1].params&&routes[routes.length-1].params.login;                                   goToLogin&&goToLogin();                               }}>                                   <View style={{width:SCALE(80),height:SCALE(42),justifyContent:'center'}}>                                       <Text style={{fontSize:FONT(30/2),color:'#0094ff'}}>登入</Text>                                   </View>                               </TouchableOpacity>}                           }            />        }    };

然後在基類中寫一個函數如下:

    //react navigation返回任意頁面    goBackPage(routers,PageName){        for(let i=0;i<routers.length;i++){            if(routers[i].routeName==PageName){                if(i+1==routers.length){                    this.props.navigation.goBack(null);                    return;                }                console.log('執行了這裡 返回'+PageName+":",routers[i].key);                this.props.navigation.goBack(routers[i+1].key);                return;            }        }    };

使用如下:

//第一個參數全域路由 第二個參數要跳轉的頁面(名字為路由中註冊的名稱) super.goBackPage(Navigation_routers,PageName);

支援android&&ios
代碼:https://github.com/wuyunqiang/RNApp
親測有效哦。

方案二:
假如A ->B ->C ->D->E 順序入棧,我們可以在navigate的時候將本頁面的key作為參數,傳遞個先一個頁面,這樣下一個頁面就擁有之前頁面的key了,就可以完成返回。
A ->B{A.key} ->C {A.key,B.key}->D{A.key,B.key,C.key}->E{A.key,B.key,C.key,D.key}
但是這裡有個問題,這種會導致key有一個錯位,就是說如果你想從E頁面返回到A.
你要goback(params.keys.B);
如果只是返回一層還是使用goback();
處理錯位問題 我們只需要將key的名字改成上一個頁面的名字就可以了。
代碼如下:

  this.props.navigation.navigate('B',{keys:{ A_key:this.props.navigation.state.key,}});

這樣就可以直接使用A_key 返回A頁面了

  this.props.navigation.navigate('C',{            data:rowData,            keys:{...this.props.navigation.state.params.keys,B_key:this.props.navigation.state.key}            })
 this.props.navigation.goBack(this.props.navigation.state.params.keys. A_key y)

參考:https://stackoverflow.com/questions/45489343/react-navigation-back-and-goback-not-working

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.