react navigation goBack()返回到任意頁面(不集成redux) 一


方案一:

一、適用場景:
在app端開發的時候,相反回到某一個頁面的時候保持跳轉頁面的所有狀態不更新,也就是說不觸發新的生命周期、

例如:A——>B——>C——>D

要想從D頁面直接返回到B頁面又保持B頁面的所有狀態,不去觸發B頁面的生命周期,

有人說可以用:this.props.navigation.navigate,是可以實現跳轉,但是這樣會觸發B頁面的新的生命周期

所有用this.props.navigation.goBack('接受參數');

二、但是需要注意的是 接收的參數問題
1.官網goBack()用法react navigation官網

2.goBack的參數為頁面路由的key, 這個key是系統隨機分配的,每一次加載的時候分配的都是不一樣的; 而不是手動設置的routeName, 所以參數填routeName無法跳轉, goBack如果不帶參數(即key為undefined)會默認返回上一個頁面

goBack(key)這個key是指:

從路由值為key這個路由頁面返回,

而不是返回到值為key的頁面

也就是說從D返回到B,這里的key值並不是B頁面的路由key值,而是,C的key值,因為B是由C返回的,所以此處的key值應該為C頁面的key值

所以要想從D返回到B頁面應該是

this.props.navigation.goBack("C頁面的key")

because react-navigation only provide method goBack(key), it's go back from key, not go back to key.
————————————————
版權聲明:本文為CSDN博主「傻小胖」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_34645412/article/details/82424560

 

 

方案二:
假如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,}});
1
這樣就可以直接使用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)

方案三:

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
親測有效哦!
————————————————
版權聲明:本文為CSDN博主「WYQ_XQ」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u014041033/article/details/77880400


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM