react-native 實現帶icon的底部導航欄


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM