Skip to main content

Bottom Tabs meet Native

· 5 min read
Oskar Kwaśniewski
Oskar Kwaśniewski
Callstack

This is a guest post by Oskar Kwaśniewski, creator of react-native-bottom-tabs, a library exposing native tab primitives that integrates with React Navigation. If you like this guide, check out the react-native-bottom-tabs documentation for more!

This blog post will explain the differences between the JavaScript Bottom Tabs navigator and provide a step-by-step guide for integrating React Navigation with the Native Bottom Tabs Navigator.

Introduction

React Navigation comes with many navigators out of the box. We've got Stack, Native Stack, Drawer, and Bottom Tabs, but there were no Native Bottom Tabs until today!

Both Android and iOS have predefined native components for handling bottom navigation. For iOS it's SwiftUI's TabView component and for Android it's BottomNavigationView. The native approach gives us an appropriate appearance no matter the platform we are running on. Native Bottom Tabs is a navigator that wraps the native TabView and BottomNavigationView - so you can use them with React Navigation.

Let's dive into the details of this navigator.

Note: Native Bottom Tabs navigator is a standalone package, not released as part of React Navigation.

Overview

You still might be wondering the difference between @react-navigation/bottom-tabs and react-native-bottom-tabs.

Let's go over the main differences:

  • JS Bottom Tabs recreate the UI as closely as possible while Native Bottom Tabs use native platform primitives to create the tabs. This makes your tab navigation indistinguishable from Native Apps as they use the same components under the hood.
  • Native Bottom Tabs adapt to interfaces of a given platform for example: tvOS and visionOS show tabs as a sidebar on iPadOS they appear at the top, while JS Bottom Tabs are always at the bottom.

Distinctive features of Native Bottom Tabs

Multi-platform support

Native Bottom tabs adapt to the appearance of multiple platforms. You always get natively-looking tabs!

Native Tabs on iOS

Bottom Navigation on iOS, with native blur.

Native Tabs on Android

Bottom Navigation on Android, following Material Design 3 styling.

Native Tabs on iPadOS

On iPadOS tabs appear at the top with a button allowing you to go into the sidebar mode.

Native Tabs on visionOS

On visionOS, the tabs appear on the left side, attached outside of the window.

Native Tabs on tvOS

On tvOS tabs appear on the top, making navigation with the TV remote a breeze.

Native Tabs on macOS

On macOS, tabs appear on the left side, following the design of the Finder app.

Automatic scroll to the top

iOS TabView automatically scrolls to the top when ScrollView is embedded inside of it.

Automatic PiP avoidance

The operating system recognizes navigation in your app making the Picture in Picture window automatically avoid bottom navigation.

Platform-specific styling

For iOS bottom navigation has a built-in blur making your app stand out. For Android, you can choose between Material 2 and Material 3 and leverage Material You system styling.

TabView can turn in to a side bar on tvOS, iPadOS and macOS. The sidebarAdaptable prop controls this.

Getting started

To get started follow the installation instructions in the react-native-bottom-tabs documentation.

Native Bottom Tabs Navigation resembles JavaScript Tabs API as closely as possible. Making your migration straightforward.

As mentioned before, Native Bottom Tabs use native primitives to create the tabs. This approach also has some downsides: Native components enforce certain constraints that we need to follow.

There are a few differences between the APIs worth noting. One of the biggest is how native tabs handle images. In JavaScript tabs, you can render React components as icons, in native tabs unfortunately it’s not possible. Instead, you have to provide one of the following options:

<Tab.Screen
name="Albums"
component={Albums}
options={{
tabBarIcon: () => require('person.png'),
// SVG is also supported
tabBarIcon: () => require('person.svg'),
// or
tabBarIcon: () => ({ sfSymbol: 'person' }),
// You can also pass a URL
tabBarIcon: () => ({ uri: 'https://example.com/icon.png' }),
}}
/>

So if you need full customizability like providing custom tab bar icons, and advanced styling that goes beyond what’s possible with native components you should use JavaScript bottom tabs.

On top of that, the scope of this library doesn’t include the web so for that platform, you should use JavaScript Tabs.

To get started you can import createNativeBottomTabNavigator from @bottom-tabs/react-navigation and use it the same way as JavaScript Bottom Tabs.

Example usage

import { createNativeBottomTabNavigator } from '@bottom-tabs/react-navigation';

const Tabs = createNativeBottomTabNavigator();

function NativeBottomTabs() {
return (
<Tabs.Navigator>
<Tabs.Screen
name="index"
options={{
title: 'Home',
tabBarIcon: () => ({ uri: 'https://example.com/icon.png' }),
}}
/>
<Tabs.Screen
name="explore"
options={{
title: 'Explore',
tabBarIcon: () => ({ uri: 'https://example.com/icon.png' }),
}}
/>
</Tabs.Navigator>
);
}
Native Tabs

You can check out the project here.

Thanks for reading!

React Navigation 7.0 Release Candidate

· 4 min read

We're excited to announce the release candidate of React Navigation 7.0.

This release includes a new static API that simplifies the configuration of navigators and improves TypeScript and deep linking support. As well as various other improvements and new features.

Introducing Static API

· 5 min read

Two of the major pain points of using React Navigation have been TypeScript and deep linking configuration. Due to the dynamic nature of the navigators, it is necessary to manually maintain the TypeScript and deep linking configuration to match the navigation structure. This can be error-prone and time-consuming.

To solve this, we’re adding a new static API to React Navigation 7. It’s not the same API as React Navigation 4, but it’s similar. Many apps don’t need the features that the dynamic API provides, and they can use the simpler static API instead to simplify their codebase.

On the way to React Navigation 6.0

· 3 min read

We're excited to announce that we finally have a prerelease version of React Navigation 6. We released React Navigation 5 more than half a year ago, and it brought a lot of new possibilities with the new dynamic API, and was met with overwhelmingly positive reaction. Since then, we've been working on incremental improvements and refinements to the library and thinking about how to make it even better. This brings us to the next major version of React Navigation.

React Navigation joins GitHub Sponsors

· 4 min read
Brent Vatne
Core Team

tl;dr: We joined GitHub Sponsors, click here to see our sponsors page and become a sponsor!


React Navigation is depended on by some of the most respected engineering organizations, well-known brands, and talented startups. It's used by financial services apps like Brex and Coinbase Pro; educational apps like Codecademy Go and DataCamp; consumer apps like Shop from Shopify, Bloomberg, TaskRabbit, and Th3rdwave; entertainment apps like the National Football League (NFL) (in their main app and several others), Cameo, Tracker Network for Fortnite, and the Call of Duty companion app from Activision Blizzard. One of my personal favourite apps using React Navigation is Readwise, I love making my coffee with Single Origin 2, and managing household chores with Sweepy.

We've also seen React Navigation used in apps that help in the fight against COVID-19. Our favourites are How We Feel by Pinterest co-founder and CEO Ben Silbermann and a team from Pinterest in collaboration with leading scientists (article) and COVID Symptom Study by ZOE Global in association with King's College London (article).

React Navigation on the Web

· 6 min read

React Native has made cross-platform development much easier than before, and with React Native for Web, you can reuse code across Android, iOS and Web too!

One major pain point of reusing code for the web app has been navigation. React Navigation is one of the most widely used navigation libraries for React Native, but it didn’t support web. While you could run apps using React Navigation on the Web, a lot of things were missing, such as proper integration with URLs on the browser.

We have finally added preliminary web support to React Navigation. Let's take a look at the changes.

React Navigation 5.0 - A new way to navigate

· 7 min read
Michał Osadnik
Michał Osadnik
Core Team

Exactly two years ago, we published the first stable version of React Navigation. Throughout this time, the library has been actively developed by adding many new features and bug fixes. The essence of React Navigation was that it was a project that was to become not only a project of individual programmers adapting it to their requirements, but a community as a whole, hence the emphasis on versatility, extensibility, and the tendency to reconsider the assumptions if there were such needs. Thanks to this, the Library has been undergoing metamorphosis of both incremental and completely reorganized shape.