This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.
JavaScript tabs
Edit page
Learn how to use the JavaScript tabs layout (React Navigation bottom tabs) in Expo Router.

Configure the tab icons, nest navigators, and manage navigation history.
Tabs are a common way to navigate between different sections of an app. Expo Router provides a tabs layout to help you create a tab bar at the bottom of your app. The fastest way to get started is to use a template. See the quick start installation to get started.
Multiple tab layouts
Expo Router offers three types of tab navigators:
- JavaScript tabs: It is implemented with React Navigation's bottom tabs and offers familiar API if you have already used React Navigation.
- Native tabs: It uses a platform's native tab bar and offers native look and feel.
- Custom tabs: It provides headless tab components from
expo-router/uito build a fully custom tab layout to achieve complex UI patterns.
This guide covers the JavaScript tabs layout. For other tab layouts see:
See native tabs if you want to achieve a native look and feel for your tab bar.
See custom tabs if your app requires a fully custom design that is not possible using system tabs.
Get started with JavaScript tabs
You can use file-based routing to create a tabs layout. Here's an example file structure:
srcapp_layout.tsx(tabs)_layout.tsxindex.tsxsettings.tsxThis file structure produces a layout with a tab bar at the bottom of the screen. The tab bar will have two tabs: Home and Settings:
You can use the src/app/_layout.tsx file to define your app's root layout:
The (tabs) directory is a special directory name that tells Expo Router to use the Tabs layout.
From the file structure, the (tabs) directory has three files. The first is (tabs)/_layout.tsx. This file is the main layout file for the tab bar and each tab. Inside it, you can control how the tab bar and each tab button look and behave.
Finally, you have the two tab files that make up the content of the tabs: src/app/(tabs)/index.tsx and src/app/(tabs)/settings.tsx.
The tab file named index.tsx is the default tab when the app loads. The second tab file settings.tsx shows how you can add more tabs to the tab bar.
Tab bar options
The JavaScript tabs in Expo Router extend the Bottom Tabs Navigator from React Navigation. The specific APIs available depend on your versions. For example, Expo Router v6 extends Bottom Tabs Navigator v7. Check your versions to ensure compatibility, then you can use the same configuration props to customize the bottom tab bar and individual tabs. For example:
The supported tab bar options are listed below:
For additional details and navigator-specific examples, see React Navigation's Bottom Tabs Navigator documentation.
Advanced
Hiding a tab
Sometimes you want a route to exist but not show up in the tab bar. You can pass href: null to disable the button:
Dynamic routes
You can use a dynamic route in a tab bar. For example, you have a [user] tab that shows a user's profile. You can use the href option to link to a specific user's profile.
Note: When adding a dynamic route in your tab layout, ensure that the dynamic route defined is unique. You cannot have two screens for the same dynamic route. For example, you cannot have two
[user]tabs. If you need to have multiple dynamic routes, create a custom navigator.