1.首先补充一下以前的写法

App.js

/**
* 入口文件
*/ import React, {Component} from 'react';
import {
AppRegistry,
StyleSheet,
Text,
Image,
View,
} from 'react-native';
// 导航
import {StackNavigator, TabNavigator, DrawerNavigator} from 'react-navigation';
// 图标
import Icon from 'react-native-vector-icons/Ionicons'; // 列表页
import ListScreen from './src/pages/creation/index';
// 编辑页
import EditScreen from './src/pages/edit/index';
// 用户页
import AccountScreen from './src/pages/acount/index';
// 图片页
import PictureScreen from './src/pages/picture/index'; // 创建详情页
import DetailScreen from './src/pages/creation/detail';
// 登录页
import LoginScreen from './src/pages/acount/login'; // tabbar item
class TabBarItem extends Component {
render() {
return (
<Image
style={{tintColor: this.props.tintColor, width: 25, height: 25}}
source={this.props.focused ? this.props.selectedImage : this.props.normalImage}
/>
)
}
} const Tab = TabNavigator(
{
List: {
screen: ListScreen,
navigationOptions: () => (
{
tabBarLabel: 'List',
tabBarIcon: ({tintColor, focused}) => (
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./src/assets/img/icon_tabbar_misc.png')}
selectedImage={require('./src/assets/img/icon_tabbar_misc_selected.png')}
/>
)
}
)
},
Edit: {
screen: EditScreen,
navigationOptions: () => (
{
tabBarLabel: 'Edit',
tabBarIcon: ({tintColor, focused}) => (
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./src/assets/img/icon_tabbar_mine.png')}
selectedImage={require('./src/assets/img/icon_tabbar_mine_selected.png')}
/>
)
}
)
},
Picture: {
screen: PictureScreen,
navigationOptions: () => (
{
tabBarLabel: 'Picture',
tabBarIcon: ({tintColor, focused}) => (
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./src/assets/img/icon_tabbar_merchant_normal.png')}
selectedImage={require('./src/assets/img/icon_tabbar_merchant_selected.png')}
/>
)
}
)
},
Account: {
screen: AccountScreen,
navigationOptions: ({navigation}) => (
{
tabBarLabel: 'Account',
tabBarIcon: ({tintColor, focused}) => (
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./src/assets/img/icon_tabbar_homepage.png')}
selectedImage={require('./src/assets/img/icon_tabbar_homepage_selected.png')}
/>
)
}
)
}
},
{
// 设置默认的页面组件
initialRouteName: 'Account',
// 设置tabbar的位置,iOS默认在底部,安卓默认在顶部。
tabBarPosition: 'bottom',
// 是否允许在标签之间进行滑动。
swipeEnabled: false,
// 是否在更改标签时显示动画。
animationEnabled: false,
// 在app打开的时候将底部标签栏全部加载,默认false,推荐改成true
lazy: true,
// 按 back 键是否跳转到第一个Tab(首页), none 为不跳转
backBehavior: 'none',
tabBarOptions: {
// 文字和图片选中颜色
activeTintColor: '#ff8500',
// 文字和图片未选中颜色
inactiveTintColor: '#999',
// label和icon的背景色 未选中。
inactiveBackgroundColor: '#E8E5F8',
// 是否显示label,默认开启。
showLabel: true,
// android 默认不显示 icon, 需要设置为 true 才会显示
showIcon: true,
// 是否使标签大写,默认为true。
upperCaseLabel: false,
indicatorStyle: {
// 如TabBar下面显示有一条线,可以设高度为0后隐藏.
height: 0
},
style: {
// TabBar 背景色
backgroundColor: '#fff'
},
labelStyle: {
// 文字大小
fontSize: 10
}
}
}
); // 初始化StackNavigator
const Navigator = StackNavigator(
{
// 将TabNavigator包裹在StackNavigator里面可以保证跳转页面的时候隐藏tabbar
Tab: {
screen: Tab,
navigationOptions: {
header: null
}
},
Detail: {
screen: DetailScreen,
navigationOptions: {
header: null
}
},
Login: {
screen: LoginScreen,
navigationOptions: {
header: null
}
}
},
{
//initialRouteName: 'Login'
initialRouteName: 'Tab'
}
); const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
center: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
}); export default Navigator;

其他页面,例如:src/pages/creation/index

import React, {Component} from 'react';
import {
StyleSheet,
Text,
View,
} from 'react-native'; export default class Creation extends Component {
render() {
return (
<View style={styles.container}>
<Text>Creation page</Text>
</View>
)
}
} const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#F5FCFF',
justifyContent: 'center',
alignItems: 'center'
}
});

效果图:

警告:Method 'jumpToIndex' is deprecated.Please upgrade your code to use 'jumpTo' instead.

原因:TabNavigator已经被遗弃了,使用createBottomTabNavigator或者createMaterialTopTabNavigator,对应的标签栏位置。

2.现在的写法

/**
* 入口文件
*/ import React, {Component} from 'react';
import {
AppRegistry,
StyleSheet,
Text,
Image,
View,
} from 'react-native';
// 导航
import { createBottomTabNavigator, createStackNavigator } from 'react-navigation';
// 图标
import Icon from 'react-native-vector-icons/Ionicons'; // 列表页
import ListScreen from './src/pages/creation/index';
// 编辑页
import EditScreen from './src/pages/edit/index';
// 用户页
import AccountScreen from './src/pages/acount/index';
// 图片页
import PictureScreen from './src/pages/picture/index'; // 创建详情页
import DetailScreen from './src/pages/creation/detail';
// 登录页
import LoginScreen from './src/pages/acount/login'; // tabbar item
class TabBarItem extends Component {
render() {
return (
<Image
style={{tintColor: this.props.tintColor, width: 25, height: 25}}
source={this.props.focused ? this.props.selectedImage : this.props.normalImage}
/>
)
}
} const Tab = createBottomTabNavigator(
{
List: {
screen: ListScreen,
navigationOptions: () => (
{
tabBarLabel: 'List',
tabBarIcon: ({tintColor, focused}) => (
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./src/assets/img/icon_tabbar_misc.png')}
selectedImage={require('./src/assets/img/icon_tabbar_misc_selected.png')}
/>
)
}
)
},
Edit: {
screen: EditScreen,
navigationOptions: () => (
{
tabBarLabel: 'Edit',
tabBarIcon: ({tintColor, focused}) => (
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./src/assets/img/icon_tabbar_mine.png')}
selectedImage={require('./src/assets/img/icon_tabbar_mine_selected.png')}
/>
)
}
)
},
Picture: {
screen: PictureScreen,
navigationOptions: () => (
{
tabBarLabel: 'Picture',
tabBarIcon: ({tintColor, focused}) => (
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./src/assets/img/icon_tabbar_merchant_normal.png')}
selectedImage={require('./src/assets/img/icon_tabbar_merchant_selected.png')}
/>
)
}
)
},
Account: {
screen: AccountScreen,
navigationOptions: ({navigation}) => (
{
tabBarLabel: 'Account',
tabBarIcon: ({tintColor, focused}) => (
<TabBarItem
tintColor={tintColor}
focused={focused}
normalImage={require('./src/assets/img/icon_tabbar_homepage.png')}
selectedImage={require('./src/assets/img/icon_tabbar_homepage_selected.png')}
/>
)
}
)
}
},
{
// 设置默认的页面组件
initialRouteName: 'Account',
// 设置tabbar的位置,iOS默认在底部,安卓默认在顶部。
tabBarPosition: 'bottom',
// 是否允许在标签之间进行滑动。
swipeEnabled: false,
// 是否在更改标签时显示动画。
animationEnabled: false,
// 在app打开的时候将底部标签栏全部加载,默认false,推荐改成true
lazy: true,
// 按 back 键是否跳转到第一个Tab(首页), none 为不跳转
backBehavior: 'none',
tabBarOptions: {
// 文字和图片选中颜色
activeTintColor: '#ff8500',
// 文字和图片未选中颜色
inactiveTintColor: '#999',
// label和icon的背景色 未选中。
inactiveBackgroundColor: '#fff',
// 是否显示label,默认开启。
showLabel: true,
// android 默认不显示 icon, 需要设置为 true 才会显示
showIcon: true,
// 是否使标签大写,默认为true。
upperCaseLabel: false,
indicatorStyle: {
// 如TabBar下面显示有一条线,可以设高度为0后隐藏.
height: 0
},
style: {
// TabBar 背景色
backgroundColor: '#fff'
},
labelStyle: {
// 文字大小
fontSize: 10
}
}
}
); // 初始化StackNavigator
const Navigator = createStackNavigator(
{
// 将TabNavigator包裹在StackNavigator里面可以保证跳转页面的时候隐藏tabbar
Tab: {
screen: Tab,
navigationOptions: {
header: null // 顶部导航很多都会自己自定义,这里就为空
}
},
Detail: {
screen: DetailScreen,
navigationOptions: {
header: null
}
},
Login: {
screen: LoginScreen,
navigationOptions: {
header: null
}
}
},
{
//initialRouteName: 'Login'
initialRouteName: 'Tab' // 默认出现的Tab页面
}
); const styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
backgroundColor: '#F5FCFF',
},
center: {
flex: 1,
justifyContent: 'center',
alignItems: 'center',
},
welcome: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
instructions: {
textAlign: 'center',
color: '#333333',
marginBottom: 5,
},
}); export default Navigator;

注:

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

改为

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

react-native 自定义 TabBar的更多相关文章

  1. [RN] React Native 自定义 底部 弹出 选择框 实现

    React Native 自定义 底部选择框 实现 效果如图所示: 实现方法: 一.组件封装 CustomAlertDialog.js import React, {Component} from ' ...

  2. [RN] React Native 自定义导航栏随滚动渐变

    React Native 自定义导航栏随滚动渐变 实现效果预览: 代码实现: 1.定义导航栏 NavPage.js import React, {Component} from 'react'; im ...

  3. React Native自定义导航栏

    之前我们学习了可触摸组件和页面导航的使用的使用: 从零学React Native之09可触摸组件 - 从零学React Native之03页面导航 - 经过之前的学习, 我们可以完成一个自定义导航栏了 ...

  4. React Native自定义导航条

    Navigator和NavigatorIOS 在开发中,需要实现多个界面的切换,这时候就需要一个导航控制器来进行各种效果的切换.在React Native中RN为我们提供了两个组件:Navigator ...

  5. React Native实现一个自定义模块

    概述 在 前期介绍React Native 项目结构的时候,我们讲解过React的项目组成,其中说过 node_modules 文件夹,这是一个存放 node 模块的地方.我们知道React是用npm ...

  6. React Native之(支持iOS与Android)自定义单选按钮(RadioGroup,RadioButton)

    React Native之(支持iOS与Android)自定义单选按钮(RadioGroup,RadioButton) 一,需求与简单介绍 在开发项目时发现RN没有给提供RadioButton和Rad ...

  7. 从零学React Native之04自定义对话框

    本篇主要介绍: 1. 自定义组件 2. Alert 对话框 自定义对话框 之前的我都是利用React Native提供的基础组件对它们进行排列组合, 其实自定义也很简单, 我们还是拿上一篇文章的例子进 ...

  8. React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发

    React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发   2016/09/23 |  React Native技术文章 |  Sky丶清|  4 条评论 |  1 ...

  9. React Native : 自定义视图

    代码地址如下:http://www.demodashi.com/demo/11686.html 这次我们要做的仿 新闻头条 的首页的顶部标签列表,不要在意新闻内容. 请求数据 首先做顶部的目录视图,首 ...

  10. React Native中自定义导航条

    这是2017年年初开始的公司的项目,对于导航条的要求很高,Android和iOS上必须用一致的UI,按钮位置还有各种颜色都有要求,而且要适应各种奇葩要求. 尝试了一下当时React Native自带的 ...

随机推荐

  1. windows技术

    鼠标右键菜单中没有新建文本文件怎么办? http://jingyan.baidu.com/article/046a7b3e1d737bf9c27fa9f7.html

  2. android hook 框架 ADBI 简介、编译、运行

    Android so注入-libinject2 简介.编译.运行 Android so注入-libinject2  如何实现so注入 Android so注入-Libinject 如何实现so注入 A ...

  3. 有关BOM(Browser Object Model)的内容

    包括: BOM概述 BOM模型 Window对象(常用属性和方法,窗口的打开,窗口的关闭,模态对话框,定时器) Navigator对象(遍历navigator对象的所有属性,Navigator 对象集 ...

  4. 51nod 1433 0和5【数论/九余定理】

    1433 0和5 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 小K手中有n张牌,每张牌上有一个一位数的数,这个 ...

  5. Codeforces 825F - String Compression

    825F - String Compression 题意 给出一个字符串,你要把它尽量压缩成一个短的字符串,比如一个字符串ababab你可以转化成3ab,长度为 3,比如bbbacacb转化成3b2a ...

  6. Codeforces 1009F Dominant Indices

    另类解法 将每一个节点拥有的各深度节点数量存在vector中,向上返回,这样不会占用过多的内存,以此判断最多节点相应的深度即可,但正常写最后一个数据会T,毕竟一次复制一个节点,相当于复制了(1+2+3 ...

  7. Spfa【P1813】拯救小tim_NOI导刊2011提高(02)

    Description 小tim在游乐场,有一天终于逃了出来!但是不小心又被游乐场的工作人员发现了„„所以你的任务是安全地把小tim护送回家.但是,A市复杂的交通状况给你出了一大难题. A市一共有n个 ...

  8. ST表【p1311】 选择客栈

    题目描述 丽江河边有 n 家很有特色的客栈,客栈按照其位置顺序从 1 到 n 编号.每家客栈都按照某一种色调进行装饰(总共 k 种,用整数 0~k-1 表示),且每家客栈都设有一家咖啡店,每家咖啡店均 ...

  9. Linux查看哪些进程用了Swap分区

    如果系统的物理内存用光了,则会用到swap.系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误.通常会出现“application is out of memory”的错误,严 ...

  10. 【转】蘑菇街面试经历(已拿到offer)

    最近正好接到了蘑菇街的面试通知,顿时很欣喜,还在等通知,不知结果如何. 首先安排了一次电话面试,大体内容时现在工作的一个状态,主要负责的项目功能,模块,以及架构例如,高并发网站优化,负载均衡等等,还会 ...