React Native导航栏系列(五)createbottomtabnavigator自定义图标实现TabBar

在很多教程中,使用createbottomtabnavigator都是用的icon,需要各种引入组件,甚至还要修改配置文件。我觉得太麻烦了,就想不能使用自定义png图片吗?研究了一番之后,终于解决了这个问题,自己引入png图片作为TabBar的图标。

因为此教程是根据前面几篇一同写的,所用知识点能够相互融合,所以这里的TabBar必须要用与前面几篇文章相同的技术原理——页面栈!

第一步,安装bottom-tabs(根据你电脑系统选择命令进行安装):

npm install @react-navigation/bottom-tabs
yarn add @react-navigation/bottom-tabs

接着就是代码时刻,用我给出的代码示例,就是正常的页面效果。
在这里插入图片描述

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 *
 * @format
 * @flow strict-local
 */
import 'react-native-gesture-handler';
import * as React from 'react';
import {
    
     Component } from 'react';
import {
    
    Image} from 'react-native';
import {
    
     NavigationContainer } from '@react-navigation/native';
import {
    
     createStackNavigator } from '@react-navigation/stack';
import {
    
     createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import HomeScreen from './src/Home';
import UserListScreen from './src/UserList';
import OrderScreen from './src/Order';
import TopNav from './src/TopNav';
const Stack = createStackNavigator();
const Tab = createBottomTabNavigator();
export default class App extends Component {
    
    
  constructor(props){
    
    
    super(props);
  }

  render(){
    
    
    return (
    <NavigationContainer>
      <Stack.Navigator mode="modal">
          <Stack.Screen name="home" options={
    
    {
    
    title:'首页'}} component={
    
    TabBar} />
          <Stack.Screen name="userList" options={
    
    {
    
    title:'用户列表'}} component={
    
    UserListScreen}/>
          <Stack.Screen name="allOrder" options={
    
    {
    
    title:'所有订单'}} component={
    
    OrderScreen}/>
          <Stack.Screen name="TopNav" component={
    
    TopNav}/>
      </Stack.Navigator>
    </NavigationContainer>
    )
  }
};
function TabBar(){
    
    
    return(
      <Tab.Navigator
        screenOptions={
    
    ({
    
    route})=>({
    
    
          tabBarIcon:({
    
    focused,size,color})=>{
    
    
            let icon;
            if(route.name==="首页"){
    
    
              icon = focused ?
               (
                <Image
                  source={
    
     require('./images/home1.png') }
                  style={
    
    {
    
     width: 25, height: 25, }} />
              ) : ( <Image
                source={
    
     require('./images/home.png') }
                style={
    
    {
    
     width: 25, height: 25, }} />)
            }else if(route.name==="我的"){
    
    
              icon = focused ? (
                <Image
                  source={
    
     require('./images/me1.png') }
                  style={
    
    {
    
     width: 25, height: 25, }} />
              ) : (<Image
                source={
    
     require('./images/me.png') }
                style={
    
    {
    
     width: 25, height: 25, }} />)
            }
            return icon;
          }
        })}
        tabBarOptions={
    
    {
    
    activeTintColor:"#07B5D1",inactiveTintColor:"gray"}}
      >
        <Tab.Screen name="首页" component={
    
    HomeScreen}/>
        <Tab.Screen name="我的" component={
    
    TopNav}/>
      </Tab.Navigator>
    )
}

重点是在TabBar()这个函数中,你要搞明白,Tab.Screen是你的所有底部导航标签,写好TabBar之后,将TabBar添加到页面栈当中去。

想要实现自定义的png图片作为底部导航标签,那么需要定义Tab.Navigator里的属性screenOptions。首先定义一个变量icon,然后在对应的页面里判断focused 是否选中,如果选中了就赋值给icon一个选中的图标,也就是一个Image组件,路径根据你自己的文件夹所在地方进行引入。未选中的时候再赋值给icon一个png图片,接着在外面进行返回icon即可。

这里需要注意的是:focused,size,color这三个参数是screenOptions属性自带的,最需要用到的就是focused表示当前TabBar是否有被点中。size就是图标的大小,你可以像我上面代码那样,自己给Image一个大小。color也是可以自己进行定义。

以上就是TabBar的完整实现,有问题可以留言,帮你解决~

猜你喜欢

转载自blog.csdn.net/weixin_43729943/article/details/108378411