React-native-scrollable-tab-view詳解

示例圖.gif

前言:他方山上有佳石瞻讽,可以用來琢玉器。只有解決了一個紅屏,才有機會遇見另一個紅屏都伪。只有解決了一個困難磅轻,才有機會遇到其他的困難聋溜。O(∩_∩)O~生命不息,奮斗不止斋否。

React Native中有許多第三方用于封裝tabBar的庫老客,當然也有官方提供的苇瓣。React-native-scrollable-tab-view是一款非常實用的第三方庫贪薪。放于界面之上可以實現(xiàn)一個界面中子界面的切換效果,置于界面之下可實現(xiàn)功能模塊間的切換拧烦,通常用于封裝自定義的tabBar。

安裝

  • 在終端輸入命令 npm i react-native-scrollable-tab-view --save
    這條命令中--save的目的是讓它寫入到package.json文件中去炼吴。如若在安裝的過程中提示沒有權(quán)限安裝等信息童芹,請在這條命令的后面加上 --force強制安裝假褪。

  • 確認安裝
    打開package.json文件,如若看到下圖所示的效果,則說明安裝正確瑟由。

203DE339-1541-4DB7-A6B6-EF6FF7D8F47B.png

屬性

  • renderTabBar:用于渲染TabBar歹苦。添加該屬性狠角,需要在引入組件之時加上它的子組件丰歌。系統(tǒng)提供兩種方式晓勇,DefaultTabBar和ScrollableTabBar。DefaultTabBar表示Tab.item會平分水平方向上的空間,而ScrollableTabBar表示所有的tabBar.item的長度將會超過屏幕寬度,但是當滾動屏幕之時可以顯示出來拇泣。當然我們也可以自定義它的模式噪叙。
//引入
import ScrollableTabView, {DefaultTabBar, ScrollableTabBar} from 'react-native-scrollable-tab-view';

//在render函數(shù)中
 render() {
        return (
            <ScrollableTabView
               //渲染成ScrollableTabBar模式 
                // renderTabBar={() => <ScrollableTabBar/>}

              //渲染成自定義的模式
                renderTabBar={() => <MyTabBar tabNames={tabNames} tabIconNames={tabIconNames}/>}
     >
<ScrollableTabView/>

  • tabBarPosition:表示TabBar的位置。一共有四個取值:top(放在界面上方)霉翔、bottom(放在界面底部)睁蕾、overlayTop(有懸浮效果在上方)、overlayBottom(有懸浮效果在下方)
tabBarPosition='bottom'
8E4B4AF5-3293-4CD4-B5E0-95C544E3859C.png
  • onChangeTab:切換界面的時候會調(diào)用該方法债朵,該屬性中包含一個參數(shù)子眶,它是一個object對象,這個對象有兩個參數(shù)序芦,i表示被選中的下標壹店,ref表示被選中的對象。
onChangeTab = {(obj)=>{console.log('被選中的下標:'+obj.i);}}
  • onScroll:視圖滑動時調(diào)用芝加,該屬性會傳遞一個Float類型的數(shù)字,范圍是[0,tab的數(shù)量-1]
 onScroll={
                    (position) => {
                        console.log('滑動時的位置:' + position);
                    }
                }
  • locked:手指是否能拖動射窒,默認為false(可拖動),如為true則表示只能通過點擊tab來切換視圖藏杖。
 locked={false}
  • initialPage:初始化時被選中的下標,默認為0
initialPage={0}
  • page:設(shè)置選中指定的tab
  • children:表示所有子視圖的數(shù)組
  • tabBarUnderlineColor:設(shè)置Tab選中時下方橫線的顏色脉顿。注意蝌麸,該屬性只是在系統(tǒng)提供的DefaultTabBar和ScrollableTabBarTab狀態(tài)下才有效果。
 renderTabBar={() => <ScrollableTabBar/>}
 tabBarUnderlineColor={'red'}

  • tabBarBackgroundColor:整個tabBar的背景顏色艾疟。
  • tabBarActiveTextColor/tabBarInactiveTextColor: 選中/未選中的tabBar的文字顏色
  • tabBarTextStyle:提供一個object對象的參數(shù)来吩,用于設(shè)置文字的樣式,如字體字號
  • style:這是所有view都擁有的屬性
  • scrollWithoutAnimation:切換tab時蔽莱,是否有動畫默認是false弟疆,即沒有。
  • prerenderingsiblingsNumber:默認為0,表示預(yù)渲染視圖的個數(shù)盗冷,為0表示只渲染當前頁怠苔。

實例

效果圖.gif

1、構(gòu)建項目
為了使iOS端和android端能更和諧的使用一套代碼仪糖。先創(chuàng)建一個入口文件取名為APP.js柑司。此時,index.iOS.js和index.android.js文件就只需要引入APP.js文件即可锅劝。

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */
//iOS端和安卓端公用一套代碼
import React, { Component } from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View
} from 'react-native';
import App from './APP'
export default class babyShow extends Component {
  render() {
    return (
        <App/>
    );
  }
}

AppRegistry.registerComponent('babyShow', () => babyShow);

2攒驰、封裝自定義的TabBar。取名為MyTabBar.js
封裝時要注意故爵,有三個屬性是系統(tǒng)傳入的玻粪。即goToPage、activeTab、tabs奶段。所以要先在規(guī)定屬性類型時先寫上這三個屬性饥瓷。其他的屬性則可以自己選擇。
在使用tabbar的時候痹籍,通常會用到圖片呢铆。這里可以使用第三方的圖庫。
安裝方法如下:
npm install react-native-vector-icons --save
安裝好了之后記得一定要輸入下面的命令
rnpm link
重新編譯即可使用

import Icon from 'react-native-vector-icons/Ionicons'; //這個是圖標

以下是整個MyTabBar文件的全部代碼蹲缠。

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    TouchableOpacity,
    View
} from 'react-native';

import Icon from 'react-native-vector-icons/Ionicons'; //這個是圖標

export default class MyTabBar extends Component {
    static propTypes = {

        goToPage: React.PropTypes.func, // 跳轉(zhuǎn)到對應(yīng)tab的方法
        activeTab: React.PropTypes.number, // 當前被選中的tab下標
        tabs: React.PropTypes.array, // 所有tabs集合

        tabNames: React.PropTypes.array, // 保存Tab名稱
        tabIconNames: React.PropTypes.array, // 保存Tab圖標

    };  // 注意這里有分號


    render() {
        return (
            <View style={styles.tabs}>
                {/*遍歷棺克。系統(tǒng)會提供一個tab和下標 調(diào)用一個自定義的方法*/}
                {this.props.tabs.map((tab, i) => this.renderTabOption(tab, i))}
            </View>
        );
    }

    componentDidMount() {
        // Animated.Value監(jiān)聽范圍 [0, tab數(shù)量-1]
        this.props.scrollValue.addListener(this.setAnimationValue);
    }

    setAnimationValue({value}) {
        console.log('動畫值:'+value);
    }

///  處理tabbar的顏色和字體及圖標
    renderTabOption(tab, i) {
        let color = this.props.activeTab == i ? "#FF3399" : "#ADADAD"; // 判斷i是否是當前選中的tab,設(shè)置不同的顏色
        return (
            //因為要有點擊效果 所以要引入可觸摸組件
            <TouchableOpacity onPress={()=>this.props.goToPage(i)} style={styles.tab} key={tab}>
                <View style={styles.tabItem}>
                    <Icon
                        
                        name={this.props.tabIconNames[i]} // 圖標 調(diào)用傳入的屬性
                        size={30}
                        color={color}/>
                    <Text style={{color: color}}>
                        {this.props.tabNames[i]}
                    </Text>
                </View>
            </TouchableOpacity>
        );
    }


}

const styles = StyleSheet.create({
    tabs: {
        flexDirection: 'row',
        height: 50,
    },

    tab: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
    },

    tabItem: {
        flexDirection: 'column',
        alignItems: 'center',
    },

});

3线定、調(diào)用自定義的tabbar文件
在APP.js文件中娜谊,把屬性tabNames和tabIconNames屬性定義在狀態(tài)機上,然后傳入到屬性中斤讥。



import React,{Component} from 'react';
import {
    AppRegistry,
    StyleSheet,
    Text,
    View
} from 'react-native';

import ScrollableTabView, {DefaultTabBar, ScrollableTabBar} from 'react-native-scrollable-tab-view';

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

import MyTabBar from './Common/MyTabBar';

export default class APP extends Component {
    constructor(props) {
        super(props);
        this.state = {
            tabNames: ['主頁', '分類', '她他群','我的'],
            tabIconNames: ['ios-home', 'ios-grid',  'logo-buffer', 'ios-contact'],

        };
    }


    render() {
        let tabNames = this.state.tabNames;
        let tabIconNames = this.state.tabIconNames;
        return (
            <ScrollableTabView
                //renderTabBar={() => <DefaultTabBar/>}
                renderTabBar={() => <MyTabBar tabNames={tabNames} tabIconNames={tabIconNames}/>}


                tabBarPosition={'bottom'}

                onChangeTab={
                    (obj) => {
                        console.log('被選中的tab下標:' + obj.i);
                    }
                }

                onScroll={
                    (position) => {
                        console.log('滑動時的位置:' + position);
                    }
                }
                locked={false}
                initialPage={0}
                prerenderingSiblingsNumber={1}

            >
              {/*每個頁面 設(shè)定四個頁面*/}
                <View tabLabel="page1" style={styles.center}>
                    <Text >每一天都不同</Text>
                    <IconFont.Button name="facebook" backgroundColor="#FF3399" size={20} >
                        妲己會一直愛主人
                    </IconFont.Button>
                    <Icon name="md-alarm" size={50}></Icon>
                    <IconFont.Button name="twitter" backgroundColor="#FF3399" size={20} >
                        因為被設(shè)定成這樣
                    </IconFont.Button>
                </View>

                <View tabLabel="page2" style={styles.center}>
                    <Text style={{color:'pink'}}>小喬要努力變強</Text>
                </View>
                <View tabLabel="page3" style={styles.center}>
                    <Text style={{color:'red'}}>蘿莉身御姐心</Text>
                </View>

                <View tabLabel="page4" style={styles.center}>
                    <Text style={{color:'#70f3ff'}}>別靠近我,阿福不想帶來不幸</Text>

                </View>


            </ScrollableTabView>
        );
    }
}

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,
    },
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纱皆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芭商,更是在濱河造成了極大的恐慌派草,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铛楣,死亡現(xiàn)場離奇詭異近迁,居然都是意外死亡,警方通過查閱死者的電腦和手機簸州,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門鉴竭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岸浑,你說我怎么就攤上這事搏存。” “怎么了矢洲?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵祭埂,是天一觀的道長。 經(jīng)常有香客問我兵钮,道長蛆橡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任掘譬,我火速辦了婚禮泰演,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘葱轩。我一直安慰自己睦焕,他們只是感情好藐握,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垃喊,像睡著了一般猾普。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上本谜,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天初家,我揣著相機與錄音,去河邊找鬼乌助。 笑死溜在,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的他托。 我是一名探鬼主播掖肋,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赏参!你這毒婦竟也來了志笼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤把篓,失蹤者是張志新(化名)和其女友劉穎籽腕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纸俭,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年南窗,在試婚紗的時候發(fā)現(xiàn)自己被綠了揍很。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡万伤,死狀恐怖窒悔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情敌买,我是刑警寧澤简珠,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站虹钮,受9級特大地震影響聋庵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜芙粱,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一祭玉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧春畔,春花似錦脱货、人聲如沸岛都。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臼疫。三九已至,卻和暖如春扣孟,著一層夾襖步出監(jiān)牢的瞬間烫堤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工哈打, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塔逃,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓料仗,卻偏偏與公主長得像湾盗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子立轧,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容