react navigation返回到任意页面(不集成redux)

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 11,857评论 0 17
  • 到此为止关于navigation新路由的实现基本告一段落,最后我们来看一下怎样重置路由和如何返回堆栈中的任意页面实...
    木中木阅读 11,579评论 0 4
  • 忘掉天地 太关注一件事 最近看了吸血鬼,看了盗墓,看了解剖,等等奇奇怪怪的东西,就是随着年岁的增长仿佛那些东西拉不...
    Emotional昔_084f阅读 2,707评论 0 0
  • 第一章:向西八年至西山 自上古以来,就流传着这么一个传说:往极西之地组曲,八年有余可寻至西山。若问西山是何处?还不...
    荣阿不听话阅读 1,769评论 1 0
  • 雁门说张辽, 白狼山下骁。 荡平辽东乱, 濡须胆气豪。 大将乐文谦, 随曹越多年 不避刀石前。 黎阳争当先, 钜平...
    卫公子无忌阅读 2,895评论 8 8

友情链接更多精彩内容