Cómo Personalizar y Configurar un Bottom Tab Navigator en React Navigation
En este artículo, aprenderemos cómo configurar un Bottom Tab Navigator en React Navigation y, además, personalizaremos su diseño para que se ajuste a nuestras necesidades. Vamos a desglosar cada paso, desde la instalación inicial hasta la personalización de los estilos y funcionalidades.
Configuración Inicial del Bottom Tab Navigator
1. Instalación del paquete necesario
Primero, necesitamos instalar el paquete específico para usar navegadores con pestañas en React Navigation. Ejecuta el siguiente comando en tu terminal:
npm install @react-navigation/bottom-tabs
Este paquete nos permite crear navegadores con pestañas en la parte inferior de nuestra aplicación.
2. Crear el archivo del navegador
Navega a la carpeta de rutas (src > presentation > routes
) y crea un archivo llamado BottomTabNavigation.tsx
con el siguiente contenido:
import React from 'react';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { Tab1Screen } from '../screens/tabs/Tab1Screen';
import { Tab2Screen } from '../screens/tabs/Tab2Screen';
import { Tab3Screen } from '../screens/tabs/Tab3Screen';
const Tab = createBottomTabNavigator();
export const BottomTabNavigator = () => {
return (
<Tab.Navigator>
<Tab.Screen name="Tab1" component={Tab1Screen} />
<Tab.Screen name="Tab2" component={Tab2Screen} />
<Tab.Screen name="Tab3" component={Tab3Screen} />
</Tab.Navigator>
);
};
En este código:
Tab.Navigator
: Es el contenedor principal para las pestañas.Tab.Screen
: Define cada pantalla asociada a una pestaña.
SideMenuNavigation
debe qudar asi para usar BottomTabNavigator
:
import React from 'react';
import { DrawerContentComponentProps, DrawerContentScrollView, DrawerItemList, createDrawerNavigator } from '@react-navigation/drawer';
import { ProfileScreen } from '../screens/profile/ProfileScreen';
import { View, useWindowDimensions } from 'react-native';
import { BottomTabNavigator } from './BottomTabNavigator';
const Drawer = createDrawerNavigator();
const CustomDrawerContent = (props: DrawerContentComponentProps) => {
return (
<DrawerContentScrollView>
<View style={{
height: 200,
backgroundColor: '#000',
margin: 30,
borderRadius: 50,
}} />
<DrawerItemList {...props} />
</DrawerContentScrollView>
);
};
export const SideMenuNavigator = () => {
const dimensions = useWindowDimensions();
return (
<Drawer.Navigator
drawerContent={props => <CustomDrawerContent {...props} />}
screenOptions={{
headerShown: false,
drawerType: dimensions.width >= 758 ? 'permanent' : 'slide',
drawerActiveBackgroundColor: 'pink',
drawerActiveTintColor: 'black',
drawerInactiveTintColor: 'red',
drawerItemStyle: {
borderRadius: 100,
paddingHorizontal: 20,
},
}}
>
<Drawer.Screen name="Tabs" component={BottomTabNavigator} />
<Drawer.Screen name="Profile" component={ProfileScreen} />
</Drawer.Navigator>
);
};
3. Probar el navegador
Si ya tienes tu configuración básica de navegación en React Navigation, puedes importar y usar BottomTabNavigator
en tu componente principal. Si no lo has hecho, consulta la documentación oficial para configurar React Navigation correctamente.
Personalización del Bottom Tab Navigator
1. Personalizando el diseño general
Podemos agregar opciones globales para personalizar el diseño general del navegador. Actualizamos el código de BottomTabNavigation.tsx
con la propiedad screenOptions
:
import React from 'react';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { Tab1Screen } from '../screens/tabs/Tab1Screen';
import { Tab2Screen } from '../screens/tabs/Tab2Screen';
import { Tab3Screen } from '../screens/tabs/Tab3Screen';
import { Text } from 'react-native-paper';
const Tab = createBottomTabNavigator();
export const BottomTabNavigator = () => {
return (
<Tab.Navigator
screenOptions={{
headerShown: true, // Muestra el encabezado en cada pantalla.
headerStyle: {
elevation: 0, // Elimina la sombra del encabezado en Android.
shadowColor: 'transparent', // Elimina la sombra del encabezado en iOS.
},
tabBarStyle: {
borderTopWidth: 0, // Elimina la línea superior de la barra de pestañas.
elevation: 0, // Elimina la sombra de la barra en Android.
},
}}
>
<Tab.Screen
name="Tab1"
options={{
title: 'Tab1',
tabBarIcon: ({ color }) => (<Text style={{ color }}>Tab11</Text>),
}}
component={Tab1Screen}
/>
<Tab.Screen
name="Tab2"
options={{
title: 'Tab2',
tabBarIcon: ({ color }) => (<Text style={{ color }}>Tab22</Text>),
}}
component={Tab2Screen}
/>
<Tab.Screen
name="Tab3"
options={{
title: 'Tab3',
tabBarIcon: ({ color }) => (<Text style={{ color }}>Tab33</Text>),
}}
component={Tab3Screen}
/>
</Tab.Navigator>
);
};
Cambios importantes:
-
headerStyle
:elevation: 0
: Elimina la sombra en el encabezado (Android).shadowColor: 'transparent'
: Elimina la sombra (iOS).
-
tabBarStyle
:borderTopWidth: 0
: Elimina la línea superior de la barra de pestañas.elevation: 0
: Elimina la sombra de la barra de pestañas.
-
tabBarIcon
:- Permite personalizar los iconos de cada pestaña. En este caso, usamos el componente
Text
para mostrar texto con color dinámico basado en la pestaña seleccionada.
- Permite personalizar los iconos de cada pestaña. En este caso, usamos el componente
2. Personalizando los títulos y estilos de las pestañas
Podemos configurar opciones individuales para cada pestaña utilizando la propiedad options
en cada Tab.Screen
. Estas opciones incluyen:
title
: Cambia el título que aparece en la barra superior.tabBarIcon
: Permite agregar un icono o texto personalizado en la barra de pestañas.
Ejemplo:
<Tab.Screen
name="Tab1"
options={{
title: 'Inicio',
tabBarIcon: ({ color }) => (<Text style={{ color }}>Inicio</Text>),
}}
component={Tab1Screen}
/>
3. Eliminando líneas y sombras no deseadas
En algunos casos, las líneas o sombras predeterminadas en las barras pueden no coincidir con el diseño de nuestra aplicación. Para resolver esto:
-
Encabezado (
headerStyle
):- Configura
elevation
(Android) oshadowColor
(iOS) a0
o'transparent'
.
- Configura
-
Barra de pestañas (
tabBarStyle
):- Configura
borderTopWidth: 0
para eliminar la línea superior. - Configura
elevation: 0
yshadowColor: 'transparent'
para eliminar sombras.
- Configura
4. Agregar colores dinámicos a los textos/iconos
Podemos personalizar el color del texto o icono de las pestañas basándonos en si están activas o no. Esto se logra utilizando las propiedades que nos proporciona React Navigation en tabBarIcon
.
Ejemplo:
tabBarIcon: ({ color }) => (<Text style={{ color }}>Tab11</Text>)