If you don't use React Navigation, you can use the TabView component directly.
Each scene in the tab view is a separate component that represents a screen. You can define these components independently:
Then use SceneMap to map route keys to scene components:
navigationStateState for the tab view. The state should contain:
routes: Array of route objects containing key and title propsindex: Current selected tab indexrenderSceneFunction that returns a React element to render for the screen. Can be created using SceneMap or custom render function.
onIndexChangeCallback that is called when the tab index changes.
labeledWhether to show labels in tabs. When false, only icons will be displayed.
booleantruefalsesidebarAdaptable A tab bar style that adapts to each platform:
disablePageAnimations Whether to disable animations between tabs.
booleanhapticFeedbackEnabledWhether to enable haptic feedback on tab press.
booleanfalsetabLabelStyleObject containing styles for the tab label. Supported properties:
fontFamilyfontSizefontWeightscrollEdgeAppearance Appearance attributes for the tab bar when a scroll view is at the bottom.
'default' | 'opaque' | 'transparent'minimizeBehavior 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.
tabBarActiveTintColorColor for the active tab.
ColorValuetabBarInactiveTintColorColor for inactive tabs.
ColorValuetabBarStyleObject containing styles for the tab bar.
Supported properties:
backgroundColor: Background color of the tab bar.translucent Whether the tab bar is translucent.
booleanactiveIndicatorColor Color of tab indicator.
ColorValuerenderBottomAccessoryView Function 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.
Each route in the routes array can have the following properties:
key: Unique identifier for the routetitle: Display title for the tabfocusedIcon: Icon to show when tab is activeunfocusedIcon: Icon to show when tab is inactive (optional)badge: Badge text to display on the tabactiveTintColor: Custom active tint color for this specific tablazy: Whether to lazy load this tab's contentfreezeOnBlur: Whether to freeze the tab's content when it's not visiblerole: A value that defines the purpose of the tabstyle: Style object for the component wrapping the screen contentpreventsDefault: Whether to prevent default tab switching behavior when pressedgetLazyFunction to determine if a screen should be lazy loaded.
route.lazygetLabelTextFunction to get the label text for a tab.
route.titlegetBadgeFunction to get the badge text for a tab.
route.badge
To display a badge without text (just a dot), you need to pass a string with a space character (" ").
getActiveTintColorFunction to get the active tint color for a tab.
route.activeTintColorgetIconFunction to get the icon for a tab.
route.focusedIcon and route.unfocusedIcongetHiddenFunction to determine if a tab should be hidden.
route.hiddengetTestIDFunction to get the test ID for a tab item.
route.testIDgetRoleFunction to get the role for a tab item.
route.rolegetSceneStyleFunction to get the style for a tab scene.
route.stylegetPreventsDefaultFunction to determine if a tab should prevent default switching behavior when pressed.
route.preventsDefault