Native Navigation导航组件的使用说明

React Native Navigation 官方文档地址: https://wix.github.io/react-native-navigation

目前稳定版本为1.0版本, 2.0是开发版, 暂时不要用.

代码库地址: https://github.com/wix/react-native-navigation

支持单页直接跳转, 直接自带顶部导航栏配置(返回,标题栏和右侧按钮), 支持直接跳转到多Tab页面, 支持隐藏显示Tab页, 支持数字气泡.

此组件底层全部使用Native代码实现, 基于iOS和Android封装而成, 缺陷是不支持顶部导航栏, 顶部导航栏可参考使用 https://github.com/Slowyn/react-native-underline-tabbar(带数字提示), 不带数字提示的可使用 https://github.com/skv-headless/react-native-scrollable-tab-view.

[TODO 翻译RRN英文文档.]

[整合步骤]

[1. 页面注册]

app/screen.js 所有需要通过导航跳转的组件都需要在此文件中注册, 第一个参数为组件别名, 需要唯一, 建议带包名.

[2. 初始化App首页]

(一般用在首次启动App时)

[整个App重新导航到单个页面]

Navigation.startSingleScreenApp({
    screen: {
        screen: 'user.LoginPage',
    },
    passProps: {}, // 被跳转页面的属性 (可选)
    portraitOnlyMode: true,// 只支持竖屏
});

[打开新的标签页App]

(只支持底部标签页)

Navigation.startTabBasedApp({
  tabs: [
    {
      label: '标签', // iOS图标下的标题 (optional)
      screen: 'example.FirstTabScreen', // unique ID registered with Navigation.registerScreen
      icon: require('../img/one.png'), // 标签未选中时的图片 (optional on iOS)
      selectedIcon: require('../img/one_selected.png'), // 标签选中时的图片 (optional, 仅支持iOS. Android使用 `tabBarSelectedButtonColor` 代替)
      title: 'Screen One', // 导航栏标题 (optional)
      navigatorStyle: {}, // override the navigator style for the tab screen, see "Styling the navigator" below (optional),
      navigatorButtons: {} // override the nav buttons for the tab screen, see "Adding buttons to the navigator" below (optional)
    },
    {
      label: 'Two',
      screen: 'example.SecondTabScreen',
      icon: require('../img/two.png'),
      selectedIcon: require('../img/two_selected.png'),
      title: 'Screen Two'
    }
  ],
  tabsStyle: { // optional, add this if you want to style the tab bar beyond the defaults
    tabBarButtonColor: '#ffff00', // optional, change the color of the tab icons and text (also unselected)
    tabBarSelectedButtonColor: '#ff9900', // optional, change the color of the selected tab icon and text (only selected)
    tabBarBackgroundColor: '#551A8B' // optional, change the background color of the tab bar
  },
  appStyle: {
    orientation: 'portrait' // Sets a specific orientation to the entire app. Default: 'auto'. Supported values: 'auto', 'landscape', 'portrait'
  },
  passProps: {}, // simple serializable object that will pass as props to all top screens (optional)
  animationType: 'slide-down' // optional, add transition animation to root change: 'none', 'slide-down', 'fade'
});

[3. 在子页面中进行跳转]

[跳入](

this.props.navigator.push({
  screen: 'example.ScreenThree', // unique ID registered with Navigation.registerScreen
  title: undefined, // 导航栏标题 (可选)
  titleImage: require('../../img/my_image.png'), //导航栏标题图片, 代替文字标题 (可选)
  passProps: {}, // 被跳转页面的属性 (可选)
  animated: true, // 是否显示动画 (可选)
  backButtonTitle: undefined, // 返回按钮的文字 (可选)
  backButtonHidden: false, // 是否隐藏返回按钮 (可选)
  navigatorStyle: {}, // 覆盖默认导航栏风格 (可选)
  navigatorButtons: {} // 覆盖默认导航栏按钮 (可选)
});

[跳出](

this.props.navigator.pop({
  animated: true // does the pop have transition animation or does it happen immediately (可选)
});

[替换当前页(不可返回原页面)]

this.props.navigator.resetTo({
  screen: 'example.ScreenThree', // unique ID registered with Navigation.registerScreen
  title: undefined, // 导航栏标题 (可选)
  titleImage: require('../../img/my_image.png'), //导航栏标题图片, 代替文字标题 (可选)
  passProps: {}, // 被跳转页面的属性 (可选)
  animated: true, // 是否显示动画 (可选)
  navigatorStyle: {}, // 覆盖默认导航栏风格 (可选)
  navigatorButtons: {} // 覆盖默认导航栏按钮 (可选)
});

[显示模态页面]

this.props.navigator.showModal({
  screen: "example.ModalScreen", // unique ID registered with Navigation.registerScreen
  title: "Modal", // title of the screen as appears in the nav bar (可选)
  passProps: {}, // simple serializable object that will pass as props to the modal (可选)
  navigatorStyle: {}, // override the navigator style for the screen, see "Styling the navigator" below (可选)
  animationType: 'slide-up' // 'none' / 'slide-up' , appear animation for the modal (可选, default 'slide-up')
});

[关闭模态页面]

this.props.navigator.dismissModal({
  animationType: 'slide-down' // 'none' / 'slide-down' , dismiss animation for the modal (可选, default 'slide-down')
});

[切换标签页的显示和隐藏]

this.props.navigator.toggleTabs({
  to: 'hidden', // 必填参数, 'hidden' = hide tab bar, 'shown' = show tab bar
  animated: true // does the toggle have transition animation or does it happen immediately (optional)
});

[切换到某个标签页](

this.props.navigator.switchToTab({
  tabIndex: 0 // (可选) 如果不提供, 则当前屏幕的标签页将被选中
});

[显示数字气泡提示]

this.props.navigator.setTabBadge({
  tabIndex: 0, // (可选) 不填写时默认添加到当前标签页
  badge: 17 // 数字气泡提示, 设置为null会删除
});

[Android设置导航软键盘背景色]

TODO

[切换导航栏的显示和隐藏](

this.props.navigator.toggleNavBar({
  to: 'hidden', // 必填参数, 'hidden' = hide tab bar, 'shown' = show tab bar
  animated: true // does the toggle have transition animation or does it happen immediately (optional)
});

注: 因为咱们的项目之前有一些导航栏是自己定制的, 如果希望页面打开时就隐藏, 可以这样写:

export default class XXXPage extends Component {

    static navigatorStyle = {
        navBarHidden: false, // 隐藏默认的顶部导航栏
        tabBarHidden: true, // 默认隐藏底部标签栏
    };

[常见问题及解决]

[和内置navigator的区别]

navigator.replace/push等报错, 因为现在项目的写法都是直接传入组件, 而replace方法要改成用reset, push等则需要传入页面ID.

更多例子参考: https://github.com/wix/react-native-navigation/tree/master/example

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

推荐阅读更多精彩内容

  • React Native开发中常用三方组件大全 作者整理的一套常用的React Native开发中使用到的三方组件...
    光强_上海阅读 21,165评论 6 95
  • 27/1000 真谦逊/思考/原则/方法论/执行力 见:谦逊,只有谦逊才能让自己从其他人的想法中获益。 感:怎样才...
    依盈阅读 282评论 0 0
  • 夜深了,你还在流泪么?你还会流泪么?因为一首歌,还是一个人,还是那些往事? 此刻的你会在哪里?一个人,还是依偎在别...
    假如爱若心飞阅读 143评论 0 1
  • 后来,入戏已深, 再后来,成为卧底。
    雨泽儿阅读 244评论 0 0
  • 【小魔仙儿】20180112学习力践行D94 亲子共读:《咪咪兔和乖乖兔》《认识新朋友》古诗:《绝句》《山居秋暝》...
    风轻云淡_adc3阅读 188评论 0 0