[React Native]react-native-scrollable-tab-view(二)

在上一篇文章中,我们学习了react-native-scrollable-tab-view的基本使用方法,以及一些基本Props的使用介绍等。从源码中我们知道它提供了两种基本的tab控制器样式,DefaultTabBar和ScrollableTabBar。很多情况,基本的样式(文字加下划线的样式)并不能满足我们的需求,这个时候我们就要自己来实现特定的样式啦。

今天讲的就是如何来自定义tab的样式,这篇文章是建立在上篇的基础之上,所以还没有阅读的朋友可以先去参考下[React Native]react-native-scrollable-tab-view(一)

本文要实现是图片+文字的样式,就像微信的底部导航栏的效果;

准备工作

1、新建一个项目
react-native init  TabDemo1
2、添加 react-native-scrollable-tab-view的三方库依赖
npm install react-native-scrollable-tab-view --save
3、添加react-native-vector-icons的三方库依赖,一个图标的库
react-native-vector-icons介绍:

一个“图标”库,官方描述为3000 Customizable Icons for React Native with support for NavBar/TabBar/ToolbarAndroid, image source and full stying.可见,这个库为我们提供了很多图标,如果你不想花费时间去设计一些图标,不妨使用这个库来替代。

这个库的图标来源有很多,下面大概列举了一些:
Entypoby Daniel Bruce (411icons)
EvilIconsby Alexander Madyankin & Roman Shamin (v1.8.0,70icons)
FontAwesomeby Dave Gandy (v4.6.3,634icons)
Foundationby ZURB, Inc. (v3.0,283icons)
Ioniconsby Ben Sperry (v3.0.0,859icons)
MaterialIconsby Google, Inc. (v2.2.3,932icons)
Octiconsby Github, Inc. (v3.5.0,166icons)
Zocialby Sam Collins (v1.0,100icons)

其中用的最多的是Ionicons,所以本篇文章的图标来源也就选择它了。另外,react-native-vector-icons的用法非常的多,今天只会用到3个基本属性:

size :设置图标的大小
name:设置使用的图标
color:设置图标的颜色系统默认

添加依赖方法如下:

 npm install react-native-vector-icons --save
 rnpm link

rnpm是一个React Native包管理器,我们也可以通过编辑android/app/build.gradle
添加下面的行达到同样的目的:

apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"

具体实现步骤

自定义一个TabBar组件你需要的了解以下几点:
a.添加必要属性到组件中(必选)

propTypes = {
  goToPage: React.PropTypes.func, // 跳转到对应tab的方法
  activeTab: React.PropTypes.number, // 当前被选中的tab下标
  tabs: React.PropTypes.array, // 所有tabs集合
}

b.实现setAnimationValue(可选,如果你需要在tab切换的时候有动画效果)

setAnimationValue({value}) {

}

c.render方法需要返回一个组件作为TabBar
d.跟其他任何组件一样,你可以传递自己的props

好了,介绍完要点,我们就开始编写自己的TabBar组件了。
1、新建一个MyTabBar.js文件,导入Ionicons

import Icon from 'react-native-vector-icons/Ionicons';

2、我们希望每个Tab的图标和名称都是外部组件通过prop传递进来,而不是内部写死,这样有利于扩展,所以我们添加两个prop:tabNames和tabIconNames

propTypes = {
  ...
  tabNames: React.PropTypes.array, // 保存Tab名称
  tabIconNames: React.PropTypes.array, // 保存Tab图标
}

3、实现render方法

render() {
  return (
    <View style={styles.tabs}>
        {this.props.tabs.map((tab, i) => this.renderTabOption(tab, i))}
    </View>
  );
}

这个方法很简单,返回一个容器View,容器View内包含的子View是通过遍历tabs,调用renderTabOption方法来动态生成的。

4、实现renderTabOption方法

renderTabOption(tab, i) {
  const color = this.props.activeTab == i?  "#2D2F46" : "#B2B4C6"; // 判断i是否是当前选中的tab,设置不同的颜色
  return (
    <TouchableOpacity onPress={()=>this.props.goToPage(i)} style={styles.tab}>
        <View style={styles.tabItem}>
            <Icon
                name={this.props.tabIconNames[i]}  // 图标
                size={30}
                color={color}/>
            <Text style={{color: color}}>
                {this.props.tabNames[i]}
            </Text>
        </View>
    </TouchableOpacity>
   );
}

这个方法应该也比较简单,使用TouchableOpacity包裹两个View:Icon和Text。

代码分析:

首先,判断i是否是当前选中的activeTab,来设置不同的字体颜色,然后:TouchableOpacity:点击触发onPress方法,使用goToPage跳转到对应的tab
Icon:设置name(图标,使用tabIconNames[i]获取),size(图标大小),color(图标颜色)
Text:设置文本(使用tabNames[i]获取),color(文字颜色)
---------------------------end---------------------------

5、使用MyTabBar
打开index.android.js文件,导入ScrollableTabView 和 MyTabBar

import ScrollableTabView from 'react-native-scrollable-tab-view'
import MyTabBar from './MyTabBar'

我们最终实现的效果图有4个tab,所以这里定义两个数组tabNames和tabIconNames,分别表示每个tab显示的文字和图片

constructor(props) {
  super(props);

  this.state = {
      tabNames: ['Tab1', 'Tab2', 'Tab3', 'Tab4'],
      tabIconNames: ['ios-paper', 'ios-albums', 'ios-paper-plane', 'ios-person-add'],
  };
}

最后,实现render方法

render() {
    let tabNames = this.state.tabNames;
    let tabIconNames = this.state.tabIconNames;
    return (
        <ScrollableTabView
            renderTabBar={() => <MyTabBar 
            tabNames={tabNames} 
            tabIconNames={tabIconNames}/>}
            tabBarPosition='bottom'>
            <View style={styles.content} tabLabel='key1'>
                <Text>第一个tab页</Text>
            </View>
            <View style={styles.content} tabLabel='key2'>
                <Text>第二个tab页</Text>
            </View>
            <View style={styles.content} tabLabel='key3'>
                <Text>第三个tab页</Text>
            </View>
            <View style={styles.content} tabLabel='key4'>
                <Text>第四个tab页</Text>
            </View>
        </ScrollableTabView>
    );
}

其中renderTabBar使用了我们自定义的MyTabBar。需要说明的是,即使我们不使用系统的DefaultTabBar和ScrollableTabBar,但tabLabel这个属性必须设置,且值不能重复,不知道为啥,有大神知道的话,可以留言。

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

推荐阅读更多精彩内容