react-native 實現帶icon的底部導航欄
一:需要的依賴包
yarn add react-navigation react-navigation-tabs react-navigation-stack react-native-gesture-handler react-native-gesture-handler react-native-reanimated react-native-vector-icons --save
如果有安裝失敗的依賴包,就一個一個的安裝。我在這邊遇到一個react-native-vector-icons總是安裝失敗的問題,解決方法是把yarn add react-native -g后,再次安裝就沒問題了。
二:寫頁面
import { createStackNavigator } from 'react-navigation-stack'; import { createAppContainer, createSwitchNavigator } from 'react-navigation'; import { createBottomTabNavigator } from 'react-navigation-tabs'; import React, { Component } from 'react'; import { Platform, View, Text } from 'react-native'; // console.disableYellowBox = true; // 關閉全部黃色警告 import MaterialIcons from 'react-native-vector-icons/MaterialIcons'; class Page1 extends React.Component { render() { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Home1!</Text> </View> ); } } class Page2 extends React.Component { render() { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Home2!</Text> </View> ); } } class Page3 extends React.Component { render() { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Home3!</Text> </View> ); } } class Page4 extends React.Component { render() { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Home4!</Text> </View> ); } } export const BottomTab = createAppContainer( createBottomTabNavigator( { /*Page1路由*/ Page1: { /*Page1頁面*/ screen: Page1, /*屏幕導航選項,可以定制導航器顯示屏幕的方式(頭部標題,選項卡標簽等)*/ navigationOptions: { /*導航標簽名*/ tabBarLabel: '頁1', /*導航呈現的圖標*/ tabBarIcon: ({ tintColor, focused }) => ( /*第三方圖標庫(圖標名稱,圖標大小,圖標樣式*/ <MaterialIcons name={'home'} size={26} style={{ color: tintColor }} /> ), tabBarOnPress: (event) => { event.defaultHandler();//調用組建內默認的實現方法 console.log('點擊了某個tabBatBtn' + event); }, }, }, Page2: { screen: Page2, navigationOptions: { tabBarLabel: '頁2', tabBarIcon: ({ tintColor, focused }) => ( <MaterialIcons name={'location-on'} size={26} style={{ color: tintColor }} /> ), tabBarOnPress: (event) => { event.defaultHandler();//調用組建內默認的實現方法 console.log('點擊了某個tabBatBtn' + event); }, }, }, Page3: { screen: Page3, navigationOptions: { tabBarLabel: '頁3', tabBarOnPress: (event) => { event.defaultHandler();//調用組建內默認的實現方法 console.log('點擊了某個tabBatBtn' + event); }, }, }, Page4: { screen: Page4, navigationOptions: { tabBarLabel: '頁4', tabBarIcon: ({ tintColor, focused }) => ( <MaterialIcons name={'perm-identity'} size={26} style={{ color: tintColor }} /> ), tabBarOnPress: (event) => { event.defaultHandler();//調用組建內默認的實現方法 console.log('點擊了某個tabBatBtn' + event); }, }, }, }, { tabBarOptions: { /*設置活動選項卡標簽的顏色*/ activeTintColor: Platform.OS === 'ios' ? '#06C1AE' : '#06C1AE', // activeBackgroundColor: 'red',//活動選項卡的背景顏色。 // inactiveTintColor: 'yellow',//非活動選項卡的標簽和圖標顏色。 // inactiveBackgroundColor: 'pink',//非活動選項卡的背景顏色。 // showLabel: true,//是否為標簽顯示標簽,默認為true。 showIcon: false,//是否顯示選項卡的圖標,默認為true。顯示icon的話,labelStyle的的行高就要刪掉 // style: {},//標簽欄的樣式對象。 labelStyle: {//選項卡標簽的樣式對象。 fontSize: 16, lineHeight: 46 // style和tabStyle都找不到垂直居中的屬性,只能設置行高。 }, tabStyle: {},//選項卡的樣式對象。 // allowFontScaling: true,//標簽字體是否應縮放以符合“文本大小”輔助功能設置,默認為true。 // //覆蓋forceInset道具 < SafeAreaView >。 // // 默認為{bottom:'always', top:'never'}。可用鍵top | bottom | left | right隨值提供'always' | 'never'。 safeAreaInset: { bottom: 'never', top: 'always' }, }, }, ), ); const AppRouter = createStackNavigator({ Home: { screen: BottomTab, navigationOptions: { header: null, //可以通過將header設為null來禁用StackNavigator的Navigation }, }, }); export const AppCreateNavigator = createAppContainer( createSwitchNavigator( { AppRouter: AppRouter, }, { initialRouteName: 'AppRouter', }, ), ); export default class app extends React.Component { render() { return ( <AppCreateNavigator /> ) } }
注意點:1、設置icon時,labelStyle不要設置行高。沒有圖標並且想要文字垂直居中的話,要設置labelStyle的行高。
具體的配置見這里:React Navigation