First install @bottom-tabs/react-navigation which provides a native bottom tab navigator for React Navigation.
To use this navigator, ensure that you have @react-navigation/native and its dependencies (follow this guide).
Minimal example of using createNativeBottomTabNavigator with React Navigation:
The Tab.Navigator component accepts following props:
idOptional unique ID for the navigator. This can be used with navigation.getParent to refer to this navigator in a child navigator.
initialRouteNameThe name of the route to render on first load of the navigator.
screenOptionsDefault options to use for the screens in the navigator.
backBehaviorThis controls what happens when goBack is called in the navigator. This includes pressing the device's back button or back gesture on Android.
It supports the following values:
firstRoute - return to the first screen defined in the navigator (default)initialRoute - return to initial screen passed in initialRouteName prop, if not passed, defaults to the first screenorder - return to screen defined before the focused screenhistory - return to last visited screen in the navigator; if the same screen is visited multiple times, the older entries are dropped from the historynone - do not handle back buttonlabeledWhether to show labels in tabs.
booleantruefalserippleColor androidChanges ripple color on tab press.
disablePageAnimationsWhether to disable page animations between tabs.
scrollEdgeAppearance iOSDescribes the appearance attributes for the tabBar to use when an observable scroll view is scrolled to the bottom.
Available options:
default - uses default background and shadow values.transparent - uses transparent background and no shadow.opaque - uses set of opaque colors that are appropriate for the current theme
It's recommended to use transparent or opaque without lazy loading as the tab bar background flashes when a view is rendered lazily.
tabBarActiveTintColorColor for the active tab.
tabBarInactiveTintColorColor for the inactive tabs.
tabBarStyleObject containing styles for the tab bar.
Supported properties:
backgroundColor: Background color of the tab bar.activeIndicatorColor androidColor of tab indicator. This option is only compatible with Material3 themes.
translucent iOSA Boolean value that indicates whether the tab bar is translucent.
sidebarAdaptable iOSA tab bar style that adapts to each platform.
Tab views using the sidebar adaptable style have an appearance
TabSection.hapticFeedbackEnabledWhether to enable haptic feedback on tab press. Defaults to false.
minimizeBehavior iOS 26+Controls how the tab bar behaves when content is scrolled.
'automatic' | 'onScrollDown' | 'onScrollUp' | 'never'undefined (uses system default)Options:
automatic: Platform determines the behavioronScrollDown: Tab bar minimizes when scrolling downonScrollUp: Tab bar minimizes when scrolling upnever: Tab bar never minimizesThis feature requires iOS 26.0 or later and is only available on iOS. On older versions, this prop is ignored.
tabLabelStyleObject containing styles for the tab label.
Supported properties:
fontFamilyfontSizefontWeighttabBarFunction that returns a React element to display as the tab bar.
The function receives an object containing the following properties as the argument:
state - The state object for the tab navigator.descriptors - The descriptors object containing options for the tab navigator.navigation - The navigation object for the tab navigator.The state.routes array contains all the routes defined in the navigator. Each route's options can be accessed using descriptors[route.key].options.
Example:
renderBottomAccessoryView iOS experimentalFunction that returns a React element to render as bottom accessory.
This feature requires iOS 26.0 or later and is only available on iOS. On older versions, this prop is ignored.
The following options can be used to configure the screens in the navigator. These can be specified under screenOptions prop of Tab.navigator or options prop of Tab.Screen.
titleTitle text for the screen.
tabBarLabelLabel text of the tab displayed in the navigation bar. When undefined, scene title is used.
tabBarActiveTintColorColor for the active tab.
The tabBarInactiveTintColor is not supported on route level due to native limitations. Use inactiveTintColor in the Tab.Navigator instead.
tabBarIconFunction that given { focused: boolean } returns ImageSource or AppleIcon to display in the navigation bar.
SF Symbols are only supported on Apple platforms.
Metro transformers that modify the import resolutions of images to something that is not React Native's ImageSource will break this. A notable community example of such is react-native-svg-transformer.
For best results, avoid the use of such transformers altogether.
If however, it is necessary to use such a transformer, you can modify your metro.config.js file to resolve the asset to ImageSource with another extension.
For example, with react-native-svg-transformer, you can resolve the svg extension to use react-native-svg-transformer, and use an alternative extension like svgx to resolve it normally with React Native's default behavior.
To do so, change the extension of your icon SVG file from .svg to .svgx and modify your metro.config.js file like so:
Then change your require calls like so:
tabBarBadgeBadge to show on the tab icon.
To display a badge without text (just a dot), you need to pass a string with a space character (" ").
tabBarItemHiddenWhether the tab bar item is hidden.
Due to native limitations on iOS, this option doesn't hide the tab item when hidden route is focused.
lazyWhether this screens should render the first time it's accessed. Defaults to true. Set it to false if you want to render the screen on initial render.
freezeOnBlurBoolean indicating whether to prevent inactive screens from re-rendering. Defaults to false.
It's working separately from enableFreeze() in react-native-screens. So settings won't be shared between them.
preventsDefaultWhether to prevent default tab switching behavior when this tab is pressed. This is useful when you want to handle tab press events manually without switching tabs.
booleanfalse
Due to iOS 26's new tab switching animations, controlling tab switching from JavaScript can cause significant delays. The preventsDefault option allows you to define this behavior statically to avoid animation delays.
tabBarButtonTestIDTest ID for the tab item. This can be used to find the tab item in the native view hierarchy.
role iOS 18+A value that defines the purpose of the tab. This can be used to pin and separate search tabs
Available options:
search - The search role.sceneStyleStyle object for the component wrapping the screen content.
The navigator can emit events on certain actions. Supported events are:
tabPressThis event is fired when the user presses the tab button for the current screen in the tab bar.
To prevent the default behavior, you can call event.preventDefault:
tabLongPressThis event is fired when the user presses the tab button for the current screen in the tab bar for an extended period.
Example:
useBottomTabBarHeightThis hook returns the height of the bottom tab bar. This is useful when you want to place a component above the tab bar on iOS. It's not needed to offset the content of the screen as the navigator does it automatically.
Alternatively, you can use the BottomTabBarHeightContext directly if you are using a class component or need it in a reusable component that can be used outside the bottom tab navigator: