zoukankan      html  css  js  c++  java
  • 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={{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

  • 相关阅读:
    设计模式之策略模式
    整理Java面向对象
    springboot+easyui+jpa实现动态权限角色的后台管理系统(二)
    随笔9
    随笔8
    随笔7
    PHP curl方法集合
    curl json方式提交
    富文本图片和视频标签增加域名前缀
    fastadmin原生编辑按钮点击默认100%显示
  • 原文地址:https://www.cnblogs.com/itgezhu/p/11545281.html
Copyright © 2011-2022 走看看