ReactNative中TabBarIOS和NavigatorIOS嵌套使用

在原生的iOS中,现在很多的项目结构都是UITabBarController和UINavigationController嵌套使用的,在ReactNative中要实现TabBarIOS和NavigatorIOS的嵌套,流程和原生的iOS非常相似,这篇文章将介绍这两者的嵌套,因为我是做iOS开发的,所以只会与iOS中的流程进行对比,Android的同学可以参考一下。

本文的Demo最终要实现的效果如下:

最终效果.gif

1. 文件结构

这个Demo中所创建的文件结构如下图:


文件结构.png
  • HomePage.js 代表首页面
  • FavorPage.js 代表TabBar的第二个页面(收藏页面)
  • NextPage.js 是首页push进入的第二个页面
  • MyTabBar.js 是自己创建的TabBar和Navigator组件

2.TabBarIOS 和 TabBarIOS.Item的基本使用

1)封装自定义TabBarIOS组件
ReactNativeTabBarIOS组件的使用其实跟我们在iOS中使用UITabBarController很相似。而TabBarIOS.Item类似于iOS开发中的每个childViewController
在iOS开发中,要创建一个UITabBarController,我们需要先创建出对应的child ViewController,存入到UITabBarControllerviewControllers属性中,然后我们可以通过设置child ViewControllertabBarItem属性来配置BarItem。
ReactNative中,要创建一个TabBarIOS,我们先创建对应的TabBarIOS.Item组件,将它们封装在TabBarIOS组件中,然后同样的,通过设置TabBarIOS.Item的属性来配置BarItem。

TabBarIOS组件的属性主要有下面几个: TabBarIOS

  • barTintColor: 标签栏的背景颜色。
  • tintColor: 当前被选中的标签图标的颜色。
  • unselectedItemTintColor: 当前没有被选中的标签图标的颜色。仅在iOS 10及以上版本有效
  • translucent: 一个布尔值,决定标签栏是否需要半透明化。

TabBarIOS.Item组件的属性主要有下面几个: TabBarIOS.Item

  • badge: 在图标右上角显示一个红色的气泡。
  • icon: 给当前标签指定一个自定义的图标。如果定义了systemIcon属性, 这个属性会被忽略
  • onPress: 当此标签被选中时调用。你应该修改组件的状态来使得selected={true}。
  • selected : 这个属性决定了子视图是否可见。如果你看到一个空白的页面,很可能是没有选中任何一个标签。
  • selectedIcon: 当标签被选中的时候显示的自定义图标。如果定义了systemIcon属性,这个属性会被忽略。如果定义了icon而没定义这个属性,在选中的时候图标会染上蓝色。
  • systemIcon: 一些预定义的系统图标。注意如果你使用了此属性,标题和自定义图标都会被覆盖为系统定义的值。
  • title: 在图标下面显示的标题文字。如果定义了systemIcon属性,这个属性会被忽略。

打开MyTabBar.js文件,开始封装TabBarIOS组件,下面是代码标注的图,可以根据图上的步骤来理解:

代码标注.png

下面是MyTabBar.js中的代码

import HomePage from './HomePage'
import FavorPage from './FavorPage'

export default class MyTabBar extends Component {

  constructor(props) {
    super(props);
    this.state = {
      selectedBarItem : 'home'
    }
  }
  render() {
    return (
      <TabBarIOS
        barTintColor = 'white'
        tintColor = 'green'
        unselectedItemTintColor = 'gray'
        translucent = {true}
        >
          <TabBarIOS.Item
            title = '首页'
            icon = {require('./Image/home.png')}
            selectedIcon = {require('./Image/home-selected.png')}
            selected = {this.state.selectedBarItem === 'home'}
            onPress = {()=>{this.setState({selectedBarItem:'home'})}}
            >
              <HomePage></HomePage>
          </TabBarIOS.Item>
          <TabBarIOS.Item
            title = '收藏'
            systemIcon = 'favorites'
            selected = {this.state.selectedBarItem === 'favor'}
            onPress = {()=>{this.setState({selectedBarItem:'favor'})}}
            >
              <FavorPage></FavorPage>
          </TabBarIOS.Item>
      </TabBarIOS>
    );
  }
}

其中HomePageFavorPage的代码由于篇幅有限就不贴出来了,就是简单的页面颜色样式展示一下。

然后,在项目的index.ios.js文件中,导入MyTabBar组件,并使用,就可以看到效果了。

import MyTabBar from './app/MyTabBar'

export default class TabBar_Navigator extends Component {
  render() {
    return (
      <MyTabBar></MyTabBar>
    );
  }
}

3. NavigatorIOS的基本使用

TabBarIOS加入之后,我们需要在首页上加入一个NavigatorIOS组件,来控制页面的跳转。
ReactNative中的NavigatorIOS组件我们主要需要实现三个属性:

  • initialRoute : 初始化路由,这个属性其实跟iOS开发中UINavigationControllerrootViewController非常相似,将导航控制器的根页面在这个属性中配置好。

  • configureScene: 这个属性是一个可选的函数,用来配置场景动画和手势,这个函数有两个参数,一个是路由,一个是当前的路由栈。转场动画的类型有很多,可以在项目目录\node_modules\[React](http://lib.csdn.net/base/react)-native\Libraries\CustomComponents\Navigator\NavigatorSceneConfigs.js这个文件中查看。

  • renderScene: 这个属性是必要参数,用来渲染指定路由的场景。调用的参数是路由和导航器。在这个方法中,我们可以通过路由获取到当前需要渲染的页面,然后把导航器作为一个属性传给当前页面,最后将这个页面返回出去。在这个被渲染的页面中,就可以拿到导航器来进行push操作了(这一点比较难理解,可以在网上多找一些资料看看,其实我也理解的不是很好)。

因为要在HomePage中嵌入导航器,所以将上一步中TabBarIOS.Item中的<HomePage></HomePage>内容替换为下面的内容:

<NavigatorIOS
  style={{flex:1}}
  initialRoute = {{
    component: HomePage,
    title: '首页'
  }}
  configureScene = {(route) =>
    {
      return NavigatorIOS.SceneConfigs.FloatFromBottom;
    }
  }
  renderScene = { (route, navigator) => {
    let HomePage = route.component;
    return <HomePage navigator={navigator}/>
  }}
  >
</NavigatorIOS>

在首页面中,我们需要在按钮点击之后,从this.props中拿到navigator,然后通过navigator.push()方法来推出下一页面。代码如下:

export default class HomePage extends Component {

  _gotoNextPage() {
    this.props.navigator.push({
      name: 'NextPage',
      component: NextPage
    });
  }

  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.text}>这是首页</Text>
        <TouchableOpacity style={styles.nextBtn} onPress={this._gotoNextPage.bind(this)}>
          <Text style={styles.nextText}>进入下一页</Text>
        </TouchableOpacity>
      </View>
    );
  }
}

最后,我们就可以得到本文开头的效果了。

本文Demo代码

总结:

ReactNative中的TabBarIOS和NavigatorIOS的使用其实跟iOS开发中的使用非常相似,在写代码的时候可以跟iOS对比着去理解,可能会更好。

最近刚入坑RN,了解的不多,本文只是作为一个iOS开发者的一些RN总结,希望能帮助到需要了解的人。可能有哪些地方写的有问题,可以提出来,也是对我的帮助。有想要学习RN的同学如果需要视频教程或者一些书籍,可以私信我。

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

推荐阅读更多精彩内容