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.
-Â
npx expo install expo-router
If you are using the default template to create a new project, expo-router
config plugin is automatically configured in the app config automatically.
{
"expo": {
"plugins": ["expo-router"]
}
}
Find more information about using expo-router/ui
in Expo Router UI guide.
import { Tabs, TabList, TabTrigger, TabSlot } from 'expo-router/ui';
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:
useTabsWithChildren
for a hook version of this component.
Example
<Tabs>
<TabSlot />
<TabList>
<TabTrigger name="home" href="/" />
</TabList>
</Tabs>
boolean
Forward props to child component and removes the extra <View>
. Useful for custom wrappers.
UseTabsOptions
Type: React.Element<TabSlotProps>
Renders the current tab.
See:
useTabSlot
for 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>
boolean
Forward props to child component. Useful for custom wrappers.
string
Name of tab. When used within a TabList
this sets the name of the tab.
Otherwise, this references the name.
SwitchToOptions[reset] | 'onLongPress'
Resets the route when switching to a tab.
Type: React.Element<TabSlotProps>
Returns a ReactElement
of the current tab.
Example
function MyTabSlot() {
const slot = useTabSlot();
return slot;
}
Parameter | Type |
---|---|
namedParameters(optional) | TabSlotProps |
Returns a ReactElement
of the current tab.
Element
Example
function MyTabSlot() {
const slot = useTabSlot();
return slot;
}
Parameter | Type |
---|---|
options | UseTabsWithChildrenOptions |
Hook version of Tabs
. The returned NavigationContent component
should be rendered.
See:
Tabs
for 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
.
TabsContextValue
See:
Tabs
for 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
.
UseTabTriggerResult
Type: NavigationProp<ParamList, RouteName, NavigatorID, TabNavigationState<ParamListBase>, ExpoTabsScreenOptions, TabNavigationEventMap>
Literal Type: multiple types
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 | - |
Literal Type: string
Acceptable values are: 'always'
| 'onFocus'
| 'never'
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 |
---|---|---|
reset(optional) | ExpoTabsResetValue | Navigate and reset the history. |
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:
useNavigationBuilder
hook 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 | - |