react-navigation 之 TabNavigator

react-navigation 之 TabNavigator

上文已經說過StackNavigator,這篇文章說說TabNavigator管怠,TabNavigator 與 StackNavigator 用法類似 語法相似

TabNavigator平臺差異

Android IOS 默認顯示效果不一樣倒槐, Android tab默認在Top而IOS 默認在Buttom 不過我們可以設置參數改變這些默認效果

    const Presets = {
    iOSBottomTabs: {
        tabBarComponent: TabBarBottom,
        tabBarPosition: 'bottom',
        swipeEnabled: false,
        animationEnabled: false,
        lazy: false,
    },
    AndroidTopTabs: {
        tabBarComponent: TabBarTop,
        tabBarPosition: 'top',
        swipeEnabled: true,
        animationEnabled: true,
        lazy: false,
    },
};

參數說明


export default (
    routeConfigMap: NavigationRouteConfigMap,
    stackConfig: StackNavigatorConfig = {}
    )
    TabNavigator = (
    routeConfigs: NavigationRouteConfigMap,  //和StackNacigator 一樣
    config: TabNavigatorConfig = {}
    )
   export type NavigationRouteConfigMap = {
  [routeName: string]: NavigationRouteConfig<*>,
};

routeConfigs (第一個參數)

都是基于 NavigationRouteConfigMap 但不同點在于 navigationOptions 里面的參數不一致

上文已經說過了StackNavigator 這里就不累述了

navigationOptionstabBar*系列都是設置TabNavigator的

  • title
  • tabBarLabel
  • tabBarIcon
  • tabBarVisible
export type NavigationScreenOptions = {
    title?: string,
    };
export type NavigationTabScreenOptions = NavigationScreenOptions & {
    tabBarIcon?:
        | React.Element<*>
        | ((options: { tintColor: ?string, focused: boolean }) => ?React.Element<
        *
        >),
    tabBarLabel?:
        | string
        | React.Element<*>
        | ((options: { tintColor: ?string, focused: boolean }) => ?React.Element<
        *
        >),
    tabBarVisible?: boolean,
    };

export type TabViewConfig = {
    tabBarComponent?: ReactClass<*>,
    tabBarPosition?: 'top' | 'bottom',
    tabBarOptions?: {},
    swipeEnabled?: boolean,
    animationEnabled?: boolean,
    lazy?: boolean,
};

通過上面源碼可以知道:

  • title 是一個string類型的 會同時設置StackNavigator的title(當全局沒有設置title屬性時)
  • tabBarLabel 是既可以是string又可以是function(tintColor: ?string, focused: boolean)
  • tabBarIcon 是既可以是string又可以是function(tintColor: ?string, focused: boolean)
  • tabBarVisible boolean 類型 是否顯示tabbar 默認顯示

TabNavigatorConfig (第二個參數)

直接上源碼

export type TabNavigatorConfig = {
    containerOptions?: void,
    } & NavigationTabRouterConfig &
    TabViewConfig;
    export type NavigationTabRouterConfig = {
        initialRouteName?: string,
        paths?: NavigationPathsConfig,
        navigationOptions?: NavigationScreenConfig<NavigationTabScreenOptions>,
        //以下是TabBar特有的
        order?: Array<string>, // todo: type these as the real route names rather than 'string'
        // Does the back button cause the router to switch to the initial tab
        backBehavior?: 'none' | 'initialRoute', // defaults `initialRoute`

export type TabViewConfig = {
        tabBarComponent?: ReactClass<*>,
        tabBarPosition?: 'top' | 'bottom',
        tabBarOptions?: {},
        swipeEnabled?: boolean,
        animationEnabled?: boolean,
        lazy?: boolean,
    };
};

{

  • initialRouteName 設置默認的頁面組件
  • paths
  • navigationOptions
  • order
  • backBehavior 按 back 鍵是否跳轉到第一個Tab(首頁)换吧, none 為不跳轉
  • tabBarPosition 設置tabbar的位置寞焙,iOS默認在底部起趾,安卓默認在頂部班巩。(屬性值:'top'查近,'bottom')
  • swipeEnabled 是否允許在標簽之間進行滑動锨咙。
  • animationEnabled 是否在更改標簽時顯示動畫语卤。
  • lazy
  • tabBarOptions 配置標簽欄的一些屬性

}

由以上源碼可知
StackNavigator 區(qū)別多了 order , backBehavior,tabBarPosition,swipeEnabled,animationEnabled,lazy,backBehavior 還有 navigationOptions,tabBarOptions 的區(qū)別

tabBarOptions 配置標簽欄的一些屬性

ios  TabBarBottom.js
type DefaultProps = {
        activeTintColor: string,  // label和icon的前景色 活躍狀態(tài)下(選中)。
        activeBackgroundColor: string,  //:label和icon的背景色 活躍狀態(tài)下(選中) 蓖租。
        inactiveTintColor: string,    //label和icon的前景色 不活躍狀態(tài)下(未選中)粱侣。
        inactiveBackgroundColor: string,  //label和icon的背景色 不活躍狀態(tài)下(未選中)。
        showLabel: boolean,  // 是否顯示label蓖宦,默認開啟齐婴。
    };

type Props = {
        activeTintColor: string,  // label和icon的前景色 活躍狀態(tài)下(選中)。
        activeBackgroundColor: string,  //:label和icon的背景色 活躍狀態(tài)下(選中) 稠茂。
        inactiveTintColor: string,      //label和icon的前景色 不活躍狀態(tài)下(未選中)柠偶。
        inactiveBackgroundColor: string,  //label和icon的背景色 不活躍狀態(tài)下(未選中)。
        position: Animated.Value,
        navigation: NavigationScreenProp<NavigationState, NavigationAction>,
        jumpToIndex: (index: number) => void,
        getLabel: (scene: TabScene) => ?(React.Element<*> | string),
        renderIcon: (scene: TabScene) => React.Element<*>,
        showLabel: boolean,   // 是否顯示label睬关,默認開啟诱担。
        style?: Style,       //tabbar的樣式。
        labelStyle?: Style,   //label的樣式电爹。
        showIcon: boolean,      //是否顯示圖標蔫仙,默認關閉。
    };

android  TabBarTop.js
type DefaultProps = {
        activeTintColor: string,  //label和icon的前景色 活躍狀態(tài)下(選中) 丐箩。
        inactiveTintColor: string,  //label和icon的前景色 不活躍狀態(tài)下(未選中)摇邦。
        showIcon: boolean,          //是否顯示圖標,默認關閉屎勘。
        showLabel: boolean,         // 是否顯示label施籍,默認開啟。
        upperCaseLabel: boolean,   //是否使標簽大寫概漱,默認為true丑慎。
    };
     indicatorStyle:標簽指示器的樣式對象(選項卡底部的行)。安卓底部會多出一條線,可以將height設置為0來暫時解決這個問題竿裂。
type Props = {
        activeTintColor: string,//label和icon的前景色 活躍狀態(tài)下(選中) 玉吁。
        inactiveTintColor: string, //label和icon的前景色 不活躍狀態(tài)下(未選中)。
        showIcon: boolean,          //是否顯示圖標铛绰,默認關閉诈茧。
        showLabel: boolean,          // 是否顯示label,默認開啟捂掰。
        upperCaseLabel: boolean, //是否使標簽大寫敢会,默認為true。
        position: Animated.Value,
        navigation: NavigationScreenProp<NavigationState, NavigationAction>,
        getLabel: (scene: TabScene) => ?(React.Element<*> | string),
        renderIcon: (scene: TabScene) => React.Element<*>,
        labelStyle?: Style,     //label的樣式这嚣。
        iconStyle?: Style,      //圖標的樣式鸥昏。
    };
android  默認的 iconStyle 和 labelStyle
   icon: {
    height: 24,
    width: 24,
  },
  label: {
    textAlign: 'center',
    fontSize: 13,
    margin: 8,
    backgroundColor: 'transparent',
  },
  ios  默認的 iconStyle 和 labelStyle
   icon: {
    flexGrow: 1,
  },
  label: {
    textAlign: 'center',
    fontSize: 10,
    marginBottom: 1.5,
    backgroundColor: 'transparent',
  },

上述可知 Android 特有的屬性 : indicatorStyle,iconStyle,upperCaseLabel

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市姐帚,隨后出現的幾起案子吏垮,更是在濱河造成了極大的恐慌,老刑警劉巖罐旗,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膳汪,死亡現場離奇詭異,居然都是意外死亡九秀,警方通過查閱死者的電腦和手機遗嗽,發(fā)現死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鼓蜒,“玉大人痹换,你說我怎么就攤上這事《嫉” “怎么了娇豫?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長畅厢。 經常有香客問我冯痢,道長,這世上最難降的妖魔是什么框杜? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任浦楣,我火速辦了婚禮,結果婚禮上霸琴,老公的妹妹穿的比我還像新娘椒振。我一直安慰自己昭伸,他們只是感情好梧乘,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般选调。 火紅的嫁衣襯著肌膚如雪夹供。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天仁堪,我揣著相機與錄音哮洽,去河邊找鬼。 笑死弦聂,一個胖子當著我的面吹牛鸟辅,可吹牛的內容都是我干的。 我是一名探鬼主播莺葫,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼匪凉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捺檬?” 一聲冷哼從身側響起再层,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎堡纬,沒想到半個月后聂受,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡烤镐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年蛋济,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片职车。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡瘫俊,死狀恐怖,靈堂內的尸體忽然破棺而出悴灵,到底是詐尸還是另有隱情扛芽,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布积瞒,位于F島的核電站川尖,受9級特大地震影響,放射性物質發(fā)生泄漏茫孔。R本人自食惡果不足惜叮喳,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缰贝。 院中可真熱鬧馍悟,春花似錦、人聲如沸剩晴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毅整,卻和暖如春趣兄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悼嫉。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工艇潭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人戏蔑。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓蹋凝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親总棵。 傳聞我的和親對象是個殘疾皇子仙粱,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容