最近剛開始學習react-native,在作一些小項目,實現底部tab欄時卡了半天,終於解決了!
開始去網上找實現底部tab欄的方法時,不少文章都寫了用react-native-tab-navigator
這個npm包實現。可是react-native-tab-navigator
最後更新時間已是2017年了,已經有兩年多沒有維護和更新了!所以隨着react版本的更新,react-native-tab-navigator
不少實現方法已經和新版本的react發生衝突了,若是項目引入了這個包,運行時就會發現報錯。例如:Warning: componentWillReceiveProps has been renamed, and is not recommended for use
。緣由是componentWillReceiveProps
生命週期鉤子在react中已經改成了UNSAFE_componentWillReceiveProps
。諸如此類,所以不要再使用react-native-tab-navigator了(好多文章竟然2019年了還在用這個包)。
node
推薦使用react-navigation-tabs包,如下是相關步驟。react
運行下面兩個指令之一android
npm install react-native-reanimated react-native-gesture-handler react-native-screensreact-navigation react-navigation-tabs --save yarn add react-native-reanimated react-native-gesture-handler react-native-screensreact-navigation react-navigation-tabs
引入react-native-reanimated
,react-native-gesture-handler
,react-native-screens
,react-navigation
,react-navigation-tabs
5個包,由於咱們的底部導航欄要配合路由使用,前三個包是和react-native路由相關的包,後兩個是和咱們底部導航相關的包。npm
import React from 'react'; import { Text, View } from 'react-native'; import { createAppContainer } from 'react-navigation'; import { createBottomTabNavigator } from 'react-navigation-tabs'; // 路由 組件 HomeScreen class HomeScreen extends React.Component { render() { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Home!</Text> </View> ); } } // 路由 組件 SettingsScreen class SettingsScreen extends React.Component { render() { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Settings!</Text> </View> ); } } // 生成導航欄 const TabNavigator = createBottomTabNavigator({ Home: HomeScreen, Settings: SettingsScreen, }); const AppContainer = createAppContainer(TabNavigator); class App extends React.Component { render(){ return <AppContainer></AppContainer> } }; export default App;
發現成功顯示了導航欄,可是由於沒有圖標,看上去有些奇怪,配置圖標繼續往下走react-native
yarn add react-native-vector-icons
或者npm install react-native-vector-icons --save
android/app/build.gradle
目錄中加入以下代碼:project.ext.vectoricons = [ iconFontNames: [ 'MaterialIcons.ttf', 'EvilIcons.ttf', 'FontAwesome' ] ] apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"
而後將node_modules/react-native-vector-icons/Fonts
文件夾下面的全部文件,複製到android/app/src/main/assets/fonts
文件夾下(若沒有該文件夾則新建該文件夾)。app
import React from 'react'; import { Text, View } from 'react-native'; import { createAppContainer } from 'react-navigation'; import { createBottomTabNavigator } from 'react-navigation-tabs'; // 路由 組件 HomeScreen class HomeScreen extends React.Component { render() { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Home!</Text> </View> ); } } // 路由 組件 SettingsScreen class SettingsScreen extends React.Component { render() { return ( <View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}> <Text>Settings!</Text> </View> ); } } // 生成導航欄 const TabNavigator = createBottomTabNavigator( { Home: HomeScreen, Settings: SettingsScreen, }, { defaultNavigationOptions: ({ navigation }) => ({ tabBarIcon: ({ focused, horizontal, tintColor }) => { const { routeName } = navigation.state; let iconName; if (routeName === 'Home') { iconName = 'home' } else if (routeName === 'Settings') { iconName = `gear`; } return <Icon name={iconName} size={25} color={tintColor} />; }, }), tabBarOptions: { activeTintColor: '#409EFF', // 選中項的顏色 inactiveTintColor: '#909399', // 未選中項的顏色 }, } ); const AppContainer = createAppContainer(TabNavigator); class App extends React.Component { render(){ return <AppContainer></AppContainer> } };
成功實現!學習