Possibly the most common style of navigation in mobile apps is tab-based navigation. This can be tabs on the bottom of the screen or on the top, below the header (or in place of the header).
Minimal example of tab-based navigation
Customizing the appearance
This is similar to how you would customize a
StackNavigator — there are some properties that are set when you initialize the
TabNavigator and others that can be customized per-screen in
Let's dissect this:
tabBarIconis a property on
navigationOptions, so we know we can use it on our screen components, but in this case chose to put it in the
TabNavigatorconfiguration in order to centralize the icon configuration for convenience.
tabBarIconis a function that is given the
tintColor. If you take a peek further down in the configuration you will see
inactiveTintColor. These default to the iOS platform defaults, but you can change them here. The
tintColorthat is passed through to the
tabBarIconis either the active or inactive one, depending on the
focusedstate (focused is active).
- In order to make the behavior the same on iOS and Android, we have explicitly provided
swipeEnabled. The default behavior of
TabNavigatoris to show a tab bar on the top of the screen on Android and on the bottom on iOS, but here we force it to be on the bottom on both platforms.
- Read the full API reference for further information on
Jumping between tabs
Switching from one tab to another has a familiar API —
StackNavigator for each tab
Usually tabs don't just display one screen — for example, on your Twitter feed, you can tap on a tweet and it brings you to a new screen within that tab with all of the replies. You can think of this as there being separate navigation stacks within each tab, and that's exactly how we will model it in React Navigation.
Why do we need a TabNavigator instead of TabBarIOS or some other component?
It's common to attempt to use a standalone tab bar component without integrating it into the navigation library you use in your app. In some cases, this works fine! You should be warned, however, that you may run into some frustrating unanticipated issues when doing this.
For example, React Navigation's
TabNavigator takes care of handling the Android back button for you, while standalone components typically do not. Additionally, it is more difficult for you (as the developer) to perform actions such as "jump to this tab and then go to this screen" if you need to call into two distinct APIs for it. Lastly, mobile user interfaces have numerous small design details that require that certain components are aware of the layout or presence of other components — for example, if you have a translucent tab bar, content should scroll underneath it and the scroll view should have an inset on the bottom equal to the height of the tab bar so you can see all of the content. Double tapping the tab bar should make the active navigation stack pop to the top of the stack, and doing it again should scroll the active scroll view in that stack scroll to the top. While not all of these behaviors are implemented out of the box yet with React Navigation, they will be and you will not get any of this if you use a standalone tab view component.
A tab icon that doesn't navigate
If you want a tab icon that never actually opens a stack navigator, simple provide the
tabBarOnPress callback for the tab's
navigationOptions without invoking the provided