react native 强大的navigation V2.0+

前言

笔者在V2版之前使用的版本是 1.5.1,现项目中升级到2.6.2。以下是我使用这两个版本的一些经验,分享给大家,希望节省大家一些宝贵的时间。

注意/优化项

导航器导出名字改变

升级前:

import { StackNavigator, TabNavigator, DrawerNavigator} from 'react-navigation'

升级后:

import {  createStackNavigator, createBottomTabNavigator, createDrawerNavigator } from 'react-navigation'

新增getParam('id', '默认值');

通过navigate传餐到下一个界面可以设置默认值了,再也不用在接受的界面使用三元表达式判断传入值是否存在了。

let {navigation} = this.props;
        this.state = {
            id: navigation.getParam('id', 0) //如果没有接收到id,给id赋值为0
        }

正文

我在使用 1.5.1版的时候遇到过下面这样的需求:

需求一:界面跳转:需要实现 A——>B B——>C C——>A,甚至更深层次的界面跳转到A

需求二:需要使用多个导航器,而且相互之间不影响。(引导页,登陆,注册,忘记密码的等界面的实现)。

需求三:一个界面多次被使用,(比如一个社交的帖子详情,点击头像进入个人主页,在个人主页中点击帖子,又进入到帖子详情,然后再点击帖子中的头像进入到个人主页。这样帖子详情 个人主页两个界面会被无限循环调用)。

需求四:快速点击时跳转下个界面,不要跳转多个相同的界面(这应该算V1+的一个缺陷)。

接下来我就根据上面的几个需求来分析在 V1.0+V2.0+ 分别是如何实现的。

需求一 V1.0+
我的实现思路是:
使用DeviceEventEmitter在B界面注册了一个返回上一个界面的goback事件, 事件触发时执行this.props.naviagtion.goBack();,然后在C界面先调用DeviceEventEmitter.emit('B界面注册的事件名'),然后再调用 this.props.naviagtion.goBack()就能达到 C——>A的效果。虽然实现了,但是心里暗地里说了一句mmp。

需求一V2.0+

直接在C界面调用this.props.naviagtion.navigate('A')就可以实现 C——>A的效果,如果A是首页的话可以调用this.props.naviagtion.popToTop()

需求二V1.0+

登陆注册界面:使用的是Modal组件,自定义的全屏悬浮窗。

需求二V2.0+

V2.0中提供了一个createSwitchNavigator,这个组件的作用个人的理解是导航器分离,永远只展示一个导航器,你可以设置多个导航器,并且当多个导航器相互切换的时候都会销毁掉其他导航器。(如何嵌套实现请看最后面的代码)

需求三V1.0+
正常使用this.props.navigation.navigate('A')可以实现这种效果(但是点击太快会多次导航到同一个界面)。

需求三V2.0+
需要注意的是V2.0+实现这种效果需要调用 this.props.navigation.push('A'),如果调用了this.props.navigation.navigate('A')你会发现当A已经在导航栈中界面跳转效果是返回到这个界面的效果;如果A是当前界面,再次调用navigate('A')没有任何效果,但是push('A')还可以继续导航到A界面。

需求四V1.0+

解决方案:在你配置导航器的.js文件最下面 export default xxx之前粘贴下面的代码

 /**解决点击太快跳转连续跳转多个界面**/

    //主要是这一步
    const navigateOnce = (getStateForAction) => (action, state) => {
        const {type, routeName} = action;
        return (
            state &&
            type === NavigationActions.NAVIGATE &&
            routeName === state.routes[state.routes.length - 1].routeName
        ) ? null : getStateForAction(action, state);
    };

    //这是第二步
    MainStackNavigator.router.getStateForAction = navigateOnce(MainStackNavigator.router.getStateForAction);

需求四V2.0+
只需要正常调用this.props.navigation.navigate('A')就可以了,官方已经修复了这个bug。

各种导航器嵌套代码


import {
    createStackNavigator,
    createBottomTabNavigator,
    createDrawerNavigator,
    createSwitchNavigator,
} from 'react-navigation'


const navigationOptions = {
    headerStyle:{
        backgroundColor: '#fff'
    },
    headerTintColor: '#666666',
    headerBackTitle: null,
    headerTitleStyle: {
        fontWeight: 'bold',
    },
    drawerLockMode:'locked-closed' 
};

        //首页导航器
const HomeStack = createStackNavigator(
    {
        Home: HomeScreen,
        HomeDetail: HomeDetailScreen,
        //其他首页导航栈下的界面
      
    },
    {
        navigationOptions:navigationOptions
    });

        //新闻导航器
const NewsStack = createStackNavigator({
        News: NewsScreen,
        NewsDetail: NewsDetailScreen,
         //其他新闻导航栈下的界面
    },
    {
        navigationOptions:navigationOptions
    });

    //登陆、注册等导航器
const LoginStack = createStackNavigator(
    {
        Login: LoginScreen,
        Register: RegisterScreen,
        Bind: BindScreen,
        UserProtocol: UserProtocolScreen
      //其他登陆导航栈下的界面
    },
    {
        navigationOptions:navigationOptions
    });


    //tab点击切换导航器
const Tab = createBottomTabNavigator({
    Home: HomeStack,
    News: NewsStack
},{
    initialRouteName: 'Home',
    tabBarOptions: {
        showLabel: false,
        style:{
            height:0 //隐藏底部切换
        }
    }
});

    //侧滑导航器
const drawerNavigator = createDrawerNavigator({
    bottomTab: Tab,
},{
    drawerWidth: width-120,
    contentComponent: CustomDrawerContentComponent
});


    //最后导出Switch导航器
export default createSwitchNavigator({
    drawerNavigator: drawerNavigator,
    loginStack: LoginStack,

})

欢迎 ❤️ 关注 你们的认可是我写作最大的动力,如果有什么错误的地方或者疑问欢迎在评论区留言讨论,我看到后会尽快回复大家。😊

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容