react-native 自定义 TabBar
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的更多相关文章
- [RN] React Native 自定义 底部 弹出 选择框 实现
React Native 自定义 底部选择框 实现 效果如图所示: 实现方法: 一.组件封装 CustomAlertDialog.js import React, {Component} from ' ...
- [RN] React Native 自定义导航栏随滚动渐变
React Native 自定义导航栏随滚动渐变 实现效果预览: 代码实现: 1.定义导航栏 NavPage.js import React, {Component} from 'react'; im ...
- React Native自定义导航栏
之前我们学习了可触摸组件和页面导航的使用的使用: 从零学React Native之09可触摸组件 - 从零学React Native之03页面导航 - 经过之前的学习, 我们可以完成一个自定义导航栏了 ...
- React Native自定义导航条
Navigator和NavigatorIOS 在开发中,需要实现多个界面的切换,这时候就需要一个导航控制器来进行各种效果的切换.在React Native中RN为我们提供了两个组件:Navigator ...
- React Native实现一个自定义模块
概述 在 前期介绍React Native 项目结构的时候,我们讲解过React的项目组成,其中说过 node_modules 文件夹,这是一个存放 node 模块的地方.我们知道React是用npm ...
- React Native之(支持iOS与Android)自定义单选按钮(RadioGroup,RadioButton)
React Native之(支持iOS与Android)自定义单选按钮(RadioGroup,RadioButton) 一,需求与简单介绍 在开发项目时发现RN没有给提供RadioButton和Rad ...
- 从零学React Native之04自定义对话框
本篇主要介绍: 1. 自定义组件 2. Alert 对话框 自定义对话框 之前的我都是利用React Native提供的基础组件对它们进行排列组合, 其实自定义也很简单, 我们还是拿上一篇文章的例子进 ...
- React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发
React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发 2016/09/23 | React Native技术文章 | Sky丶清| 4 条评论 | 1 ...
- React Native : 自定义视图
代码地址如下:http://www.demodashi.com/demo/11686.html 这次我们要做的仿 新闻头条 的首页的顶部标签列表,不要在意新闻内容. 请求数据 首先做顶部的目录视图,首 ...
- React Native中自定义导航条
这是2017年年初开始的公司的项目,对于导航条的要求很高,Android和iOS上必须用一致的UI,按钮位置还有各种颜色都有要求,而且要适应各种奇葩要求. 尝试了一下当时React Native自带的 ...
随机推荐
- 杭电oj2032、2040、2042、2054、2055
2032 杨辉三角 #include <stdio.h> int main(){ ][],i,j,n; while(~scanf("%d",&n)){ ;i& ...
- VS2013的Release模式 和 debug 模式
在有的情况下,我们可能不能直接利用Debug模式进行程序调试,那么如何在Release模式下进行程序调试呢? 一.将项目属性设置为Release,生成--->配置管理器: 二.按Alt+F7,弹 ...
- C 实现删除非空文件夹
/* 文件名: rd.c ---------------------------------------------------- c中提供的对文件夹操作的函数,只能对空文件夹进行 删除,这使很多 ...
- RobotFramework自动化1-环境搭建【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/robotframework/ 前言 Robot Framework是一款python编 ...
- 洛谷 P1739 表达式括号匹配【STL/stack/模拟】
题目描述 假设一个表达式有英文字母(小写).运算符(+,-,*,/)和左右小(圆)括号构成,以"@"作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返 ...
- Vue之$set使用
背景 后端参与前端开发的小白,在开发过程中遇到了如下情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的. ...
- ttServer缓存的简单使用
ttserver是一款 DBM 数据库,该数据库读写非常快,哈希模式写入100万条数据只需0.643秒,读取100万条数据只需0.773秒,是 Berkeley DB 等 DBM 的几倍.利用Toky ...
- 每天一个liunx命令3之awk实现文本文件的抓取
=============================================================================grep -h -s -E 'HUAWEI_9 ...
- IOS8设备连接XCODE6真机调试报错"Could not inspect the application package"
每次真机调试都要运行2次才行,解决办法:把product name改成英文就行了.
- .net / java /安卓des加密互通
一 . C#.net /// <summary> /// 加密数据 /// </summary> /// <param name="Text"> ...