This is documentation for the next SDK version. For up-to-date documentation, see the latest version (SDK 54).
An Expo Router submodule that provides headless tab components to create custom tab layouts.
expo-router/ui is a submodule of expo-router library and exports components and hooks to build custom tab layouts, rather than using the default React Navigation navigators provided by expo-router.
See the Expo Router reference for more information about the file-based routing library for native and web app.
Installation
To use expo-router/ui in your project, you need to install expo-router in your project. Follow the instructions from the Expo Router's installation guide:
Learn how to install Expo Router in your project.
Configuration in app config
If you are using the default template to create a new project, expo-router's config plugin is already configured in your app config.
Example app.json with config plugin
{ "expo": { "plugins": ["expo-router"] } }
Usage
For information about using expo-router/ui in Custom tab layouts guide:
API
import { Tabs, TabList, TabTrigger, TabSlot } from 'expo-router/ui';
Components
Type: React.Element<ProviderProps<ExpoTabsNavigatorScreenOptions>>
Type: React.Element<TabListProps>
Wrapper component for TabTriggers. TabTriggers within the TabList define the tabs.
Example
<Tabs> <TabSlot /> <TabList> <TabTrigger name="home" href="/" /> </TabList> </Tabs>
Type: React.Element<TabsProps>
Root component for the headless tabs.
See:
useTabsWithChildrenfor a hook version of this component.
Example
<Tabs> <TabSlot /> <TabList> <TabTrigger name="home" href="/" /> </TabList> </Tabs>
booleanForward props to child component and removes the extra <View>. Useful for custom wrappers.
UseTabsOptionsType: React.Element<TabSlotProps>
Renders the current tab.
See:
useTabSlotfor a hook version of this component.
Example
<Tabs> <TabSlot /> <TabList> <TabTrigger name="home" href="/" /> </TabList> </Tabs>
Type: React.Element<TabTriggerProps>
Creates a trigger to navigate to a tab. When used as child of TabList, its
functionality slightly changes since the href prop is required,
and the trigger also defines what routes are present in the Tabs.
When used outside of TabList, this component no longer requires an href.
Example
<Tabs> <TabSlot /> <TabList> <TabTrigger name="home" href="/" /> </TabList> </Tabs>
Type: React.Element<TabSlotProps>
Returns a ReactElement of the current tab.
Example
function MyTabSlot() { const slot = useTabSlot(); return slot; }
Hooks
| Parameter | Type |
|---|---|
| namedParameters(optional) | TabSlotProps |
Returns a ReactElement of the current tab.
ElementExample
function MyTabSlot() { const slot = useTabSlot(); return slot; }
| Parameter | Type |
|---|---|
| options | UseTabsWithChildrenOptions |
Hook version of Tabs. The returned NavigationContent component
should be rendered. Using the hook requires using the <TabList />
and <TabTrigger /> components exported from Expo Router.
The useTabsWithTriggers() hook can be used for custom components.
See:
Tabsfor the component version of this hook.
Example
export function MyTabs({ children }) { const { NavigationContent } = useTabsWithChildren({ children }) return <NavigationContent /> }
| Parameter | Type |
|---|---|
| options | UseTabsWithTriggersOptions |
Alternative hook version of Tabs that uses explicit triggers
instead of children.
TabsContextValueSee:
Tabsfor the component version of this hook.
Example
export function MyTabs({ children }) { const { NavigationContent } = useTabsWithChildren({ triggers: [] }) return <NavigationContent /> }
| Parameter | Type |
|---|---|
| options | TabTriggerProps |
Utility hook creating custom TabTrigger.
UseTabTriggerResultTypes
Type: NavigationProp<ParamList, RouteName, NavigatorID, TabNavigationState<ParamListBase>, ExpoTabsScreenOptions, TabNavigationEventMap>
Literal Type: union
Acceptable values are: DefaultNavigatorOptions<ParamListBase, string | undefined, TabNavigationState<ParamListBase>, ExpoTabsScreenOptions, TabNavigationEventMap, ExpoTabsNavigationProp<ParamListBase>> | Omit<TabRouterOptions, 'initialRouteName'> | ExpoTabsNavigatorScreenOptions
| Property | Type | Description |
|---|---|---|
| detachInactiveScreens(optional) | boolean | - |
| freezeOnBlur(optional) | boolean | - |
| lazy(optional) | boolean | - |
| unmountOnBlur(optional) | boolean | - |
Type: Pick<BottomTabNavigationOptions, 'title' | 'lazy' | 'freezeOnBlur'> extended by:
| Property | Type | Description |
|---|---|---|
| action | NavigationAction | - |
| params(optional) | object | - |
| title | string | - |
Options for switchTab function.
| Property | Type | Description |
|---|---|---|
| resetOnFocus(optional) | boolean | Navigate and reset the history on route focus. |
| Property | Type | Description |
|---|---|---|
| tabLongPress | {
data: undefined
} | Event which fires on long press on the tab in the tab bar. |
| tabPress | {
canPreventDefault: true,
data: undefined
} | Event which fires on tapping on the tab in the tab bar. |
Type: ReturnType<useNavigationBuilder>
The React Navigation custom navigator.
See:
useNavigationBuilderhook from React Navigation for more information.
Options provided to the UseTabSlotOptions.
| Property | Type | Description |
|---|---|---|
| detachInactiveScreens | boolean | Should the screen be unloaded when inactive. |
| index | number | Index of screen. |
| isFocused | boolean | Whether the screen is focused. |
| loaded | boolean | Whether the screen has been loaded. |
| Property | Type | Description |
|---|---|---|
| href | Href | - |
| name | string | - |
Type: extended by:
| Property | Type | Description |
|---|---|---|
| isFocused | boolean | - |
| resolvedHref | string | - |
| route | [number] | - |
Options to provide to the Tab Router.
Type: Omit<DefaultNavigatorOptions<ParamListBase, any, TabNavigationState<any>, ExpoTabsScreenOptions, TabNavigationEventMap, any>, 'children'> extended by:
| Property | Type | Description |
|---|---|---|
| backBehavior(optional) | TabRouterOptions[backBehavior] | - |
Type: PropsWithChildren<UseTabsOptions>
Type: UseTabsOptions extended by:
| Property | Type | Description |
|---|---|---|
| triggers | ScreenTrigger[] | - |
| Property | Type | Description |
|---|---|---|
| getTrigger | (name: string) => Trigger | undefined | - |
| switchTab | (name: string, options: SwitchToOptions) => void | - |
| trigger(optional) | Trigger | - |
| triggerProps | TriggerProps | - |