1. 程式人生 > >TabBar切換頁的實現——React-native-tab-navigator的使用

TabBar切換頁的實現——React-native-tab-navigator的使用

乾貨直接上程式碼

一:專案整合React-native-tab-navigator

     在當前專案下 終端執行:npm install react-native-tab-navigator –save下載

 

顯示 @xx.xx.x 版本號且 在 專案的根目錄的 \node_modules下面出現這個檔案react-native-tab-navigator   後就說明下載整合成功

二:引入react-native-tab-navigator

    import TabNavigator from 'react-native-tab-navigator';

import React, { Component } from 'react';
import TabNavigator from 'react-native-tab-navigator';
import {
  AppRegistry,
  Text,
  View,
  Navigator,
  StyleSheet,
  Image,
  TouchableHighlight  
} from 'react-native';

import HomeComponent from          './HomeComponent';
import CustomerComponent from      './CustomerComponent';
import OrderComponent  from    './OrderComponent';
import ProductComponent from    './ProductComponent';
import MineComponent  from  './MineComponent';

export default class Main extends Component 
{

 constructor(props) {
 super(props);
 this.state = {
      selectedTab:'home'
    };
 }

render() {
        return (
            <View style={styles.container} >
                <TabNavigator tabBarStyle={styles.tab}>
                    <TabNavigator.Item
                        selected={this.state.selectedTab === '首頁'}
                        title="首頁"
                        titleStyle={styles.tabText}
                        selectedTitleStyle={styles.selectedTabText}
                        renderIcon={() => <Image source={require('./img/ic_home_normal.png')} style={styles.icon}/> }
                        renderSelectedIcon={() => <Image style={styles.icon} source={require('./img/ic_home_checked.png')} />}
                        onPress={() => this.setState({ selectedTab: '首頁' })}>
                        <HomeComponent/>
                    </TabNavigator.Item>
                    <TabNavigator.Item
                        selected={this.state.selectedTab === '訂單'}
                        title="訂單"
                        titleStyle={styles.tabText}
                        selectedTitleStyle={styles.selectedTabText}
                        renderIcon={() => <Image source={require('./img/ic_order_normal.png')} style={styles.icon}/> }
                        renderSelectedIcon={() => <Image style={styles.icon} source={require('./img/ic_order_checked.png')} />}
                        onPress={() => this.setState({ selectedTab: '訂單' })}>
                        <OrderComponent />
                    </TabNavigator.Item>
                    <TabNavigator.Item
                        selected={this.state.selectedTab === '客戶'}
                        title="客戶"
                        titleStyle={styles.tabText}
                        selectedTitleStyle={styles.selectedTabText}
                        renderIcon={() => <Image source={require('./img/ic_customer_normal.png')} style={styles.icon}/> }
                        renderSelectedIcon={() => <Image style={styles.icon} source={require('./img/ic_customer_checked.png')} />}
                        onPress={() => this.setState({ selectedTab: '客戶' })}>
                        <CustomerComponent />
                    </TabNavigator.Item>
                    <TabNavigator.Item
                        selected={this.state.selectedTab === '產品'}
                        title="產品"
                        titleStyle={styles.tabText}
                        selectedTitleStyle={styles.selectedTabText}
                        renderIcon={() => <Image source={require('./img/ic_product_normal.png')} style={styles.icon}/> }
                        renderSelectedIcon={() => <Image style={styles.icon} source={require('./img/ic_product_checked.png')} />}
                        onPress={() => this.setState({ selectedTab: '產品' })}>
                        <ProductComponent />
                    </TabNavigator.Item>
                   <TabNavigator.Item
                        selected={this.state.selectedTab === '我的'}
                        title="我的"
                        titleStyle={styles.tabText}
                        selectedTitleStyle={styles.selectedTabText}
                        renderIcon={() => <Image source={require('./img/ic_mine_normal.png')} style={styles.icon}/> }
                        renderSelectedIcon={() => <Image style={styles.icon} source={require('./img/ic_mine_checked.png')} />}
                        onPress={() => this.setState({ selectedTab: '我的' })}>
                        <MineComponent />
                    </TabNavigator.Item>
                </TabNavigator>
            </View>
        );
    }


}


const styles = StyleSheet.create({
    container: {
        flex: 1
    },
    tab: {  
        height: 70,  
        backgroundColor: '#222222',  
        alignItems: 'center'  
    },
    tabText: {
        marginTop: 1,
        color: '#ffffff',
        fontSize: 16
    },
    selectedTabText: {
        marginTop: 1,
        color: '#FFD700',
        fontSize: 16
    },
    icon: {
        width: 30,
        height: 31,
        resizeMode: 'stretch',  
        marginTop: 10  
    }
});

2.TabNavigator的樣式設定

上面的程式碼當中,TabNavigator繼承於View類,除了包括style的一些屬性可以和View控制元件一樣設定外,它還具有其他一些獨特的屬性,用於控制樣式

sceneStyle:場景樣式,即Tab頁容器的樣式,可按View的style設定

tabBarStyle:TabBar的樣式,基本也可按照普通的style寫法進行設定

tabBarShadowStyle:TabBar陰影的樣式,不過對於扁平化的設計,這個屬性應該用處不大

hidesTabTouch:bool型別,即是否隱藏Tab按鈕的按下效果

根據我們上面對TabBar樣式的分析,我們可以按照如下樣式,為TabNavigator指定tabBarStyle

根據主題設定背景顏色為黑色

const styles = StyleSheet.create({
    tab: {  
        height: 70,  
        backgroundColor: '#222222',  
        alignItems: 'center'  
    }
}

3.Item的構建

TabNavigator的Item就是我們所看到的5個Tab按鈕以及它們所對應的頁面,這些頁面在Android中可能以Fragment呈現,在iOS中可能以UIView呈現,而在React Native中,則是一個<View>,我們可以自己義,也可以直接放置其他控制元件。

這些Item在TabNavigator中,以<TabNavigator.Item>形式呈現,其可設定的相關屬性如下:

renderIcon: 必填項,即圖示,但為function型別,所以這裡需要用到Arrow Function
renderSelectedIcon: 選中狀態的圖示,非必填,也是function型別
badgeText: 即Tab右上角的提示文字,可為String或Number,類似QQ中Tab右上角的訊息提示,非必填
renderBadge: 提示角標渲染方式,function型別,類似render的使用,非必填
title: 標題,String型別,非必填
titleStyle: 標題樣式,style型別,非必填
selectedTitleStyle: 選中標題樣式,style型別,非必填
selected: bool型,是否選中狀態,可使用setState進行控制,預設false
onPress: function型,即點選事件的回撥函式,這裡需要控制的是state,而切換頁面已經由控制元件本身幫我們實現好了
allowFontScaling: bool型,是否允許字型縮放,預設false

而對於我們所關心的頁面切換,在TabNavigator.Item中,可將其置於<TabNavigator.Item>{<View/>}</TabNavigator.Item>之中,即作為Item的子元素存在,這裡請注意:如果添加了一個Item,必須為其新增一個View,否則將無法執行!

這裡提醒大家:

如果使用本地圖片,即在<Image>中,source屬性內使用require的形式引用圖片,由於js本身的性質,不可以使用動態的require,而應該直接require後的圖片資源當做引數傳遞!而使用uri形式獲取線上資源不受影響

在上面的程式碼中,由於TabBar控制元件的問題,我們可以在tabIcon樣式中,控制Icon的上邊距,以達到居中的效果,程式碼如下:

    icon: {
        width: 30,
        height: 31,
        resizeMode: 'stretch',  
        marginTop: 10  
    }

這裡說明:

1.特別注意:由於在onPress函式中呼叫了this.setState,所以必須在類的使用建構函式,並對state進行初始化:

 constructor(props) {
 super(props);
 this.state = {
      selectedTab:'home'
    };
 }


效果圖: