Header
The Header
component is a component that will appear at the top of your screen. It is used to hold navigation buttons and the screen title.
<Header
titleTx="header:title"
title="Header Title"
leftIcon="back"
rightIcon="bullet"
onLeftPress={() => navigation.goBack()}
onRightPress={() => Alert.alert("pressed")}
style={{ height: 60 }}
backgroundColor="purple"
titleStyle={{ color: "white" }}
/>
Props
titleMode
The layout of the title relative to the action components.
center
will force the title to always be centered relative to the header. If the title or the action buttons are too long, the title will be cut off.
flex
will attempt to center the title relative to the action buttons. If the action buttons are different widths, the title will be off-center relative to the header.
titleStyle
The titleStyle
prop is an optional prop that is used to set the style of the header title. This is a StyleProp<TextStyle>
object.
<Header title="Header Title" titleStyle={{ color: "white" }} />
titleContainerStyle
The titleContainerStyle
prop is an optional prop that is used to set the style of the header title's outer container. This is a StyleProp<ViewStyle>
object.
<Header title="Header Title" titleContainerStyle={{ backgroundColor: "purple" }} />
containerStyle
The containerStyle
prop is an optional prop that is used to set the style of the header's outer container. This is useful specifically on notched devices to override insets. This is a StyleProp<ViewStyle>
object.
<Header title="Header Title" containerStyle={{ backgroundColor: "purple" }} />
style
The style
prop is an optional prop that is used to set the style of the header's inner container. You can use this to override the header's height. This is a StyleProp<ViewStyle>
object.
<Header title="Header Title" style={{ height: 50 }} />
backgroundColor
The backgroundColor
prop is an optional prop that is used to set the background color of the header's outer container.
<Header title="Header Title" onLeftPress={() => navigation.goBack()} backgroundColor="purple" />
title
The title
is an optional prop that is used to set the header title. If this is not set, the titleTx
prop must be present to set the title. If both are set, the title
value will be used.
<Header title="Header Title" leftIcon="back" onLeftPress={() => navigation.goBack()} />
titleTx
The titleTx
is an optional prop that is used to lookup the translation for the header title. If this is not set, the title
prop must be present to set the header title. If both are set, the title
value will be used.
<Header titleTx="header:title" leftIcon="back" onLeftPress={() => navigation.goBack()} />
titleTxOptions
The titleTxOptions
is an optional prop that is used to pass props to the translation lookup for the header title. This is useful if you need to pass in dynamic values to the translation.
<Header
titleTx="header:title"
titleTxOptions={{ name: "John" }}
leftIcon="back"
onLeftPress={() => navigation.goBack()}
/>
leftIcon
The leftIcon
is an optional prop that is used to set the icon for the left navigation button. Options are 'back', 'bullet', and 'bug'. Custom icons can be created by using the Icon
component. Once you create a custom icon, just pass the string name of the icon to the leftIcon
prop.
<Header titleTx="header:title" leftIcon="back" onLeftPress={() => navigation.goBack()} />
leftIconColor
The leftIconColor
is an optional prop that is used to set the tint color of the left navigation icon.
<Header
titleTx="header:title"
leftIcon="back"
leftIconColor="white"
onLeftPress={() => navigation.goBack()}
/>
leftText
The leftText
is an optional prop that is used to set the text for the left navigation button. Overrides the leftIcon
prop.
<Header titleTx="header:title" leftText="Back" onLeftPress={() => navigation.goBack()} />
leftTx
The leftTx
is an optional prop that is used to lookup the translation for the left navigation button. Overrides the leftIcon
and leftText
prop`.
<Header titleTx="header:title" leftTx="header:back" onLeftPress={() => navigation.goBack()} />
leftTxOptions
The leftTxOptions
is an optional prop that is used to pass props to the translation lookup for the left navigation button. This is useful if you need to pass in dynamic values to the translation.
<Header
titleTx="header:title"
leftTx="header:back"
leftTxOptions={{ name: "John" }}
onLeftPress={() => navigation.goBack()}
/>
LeftActionComponent
The LeftActionComponent
is an optional ReactElement
prop that is used to set a custom component for the left navigation button. Overrides the leftIcon
, leftText
, leftTx
, and onLeftText
props (since the passed component is completely customizable).
<Header titleTx="header:title" LeftActionComponent={<Text>Back</Text>} />
onLeftPress
The onLeftPress
is an optional prop that is used to set the function to be called when the left navigation button is pressed.
<Header titleTx="header:title" leftIcon="back" onLeftPress={() => navigation.goBack()} />
rightIcon
The rightIcon
is an optional prop that is used to set the icon for the right navigation button. Custom icons can be created by using the Icon
component. Once you create a custom icon, just pass the string name of the icon to the rightIcon
prop.
<Header titleTx="header:title" rightIcon="back" onRightPress={() => navigation.goBack()} />
rightIconColor
The rightIconColor
is an optional prop that is used to set the tint color of the right navigation icon.
<Header
titleTx="header:title"
rightIcon="back"
onRightPress={() => navigation.goBack()}
rightIconColor="white"
/>
rightText
The rightText
is an optional prop that is used to set the text for the right navigation button. Overrides the rightIcon
prop.
<Header titleTx="header:title" rightText="Back" onRightPress={() => navigation.goBack()} />
rightTx
The rightTx
is an optional prop that is used to lookup the translation for the right navigation button. Overrides the rightIcon
and rightText
prop`.
<Header titleTx="header:title" rightTx="header:back" onRightPress={() => navigation.goBack()} />
rightTxOptions
The rightTxOptions
is an optional prop that is used to pass props to the translation lookup for the right navigation button. This is useful if you need to pass in dynamic values to the translation.
<Header
titleTx="header:title"
rightTx="header:back"
rightTxOptions={{ name: "John" }}
onRightPress={() => navigation.goBack()}
/>
RightActionComponent
The RightActionComponent
is an optional ReactElement
prop that is used to set a custom component for the right navigation button. Overrides the rightIcon
, rightText
, rightTx
, and onRightPress
props (since the right action component can customize all that).
<Header titleTx="header:title" RightActionComponent={<Text>Back</Text>} />
onRightPress
The onRightPress
is an optional prop that is used to set the function to be called when the right navigation button is pressed.
<Header titleTx="header:title" rightIcon="back" onRightPress={() => navigation.goBack()} />
safeAreaEdges
The safeAreaEdges
optional prop can be used to override the default safe area edges. By default, the header will use the top
safe area edge. If you want to not account for the safe area edges, you can pass in []
to the safeAreaEdges
prop.
<Header titleTx="header:title" safeAreaEdges={[]} />
Usage
The Header is a flexible component that can be integrated within your application using a few different methods:
Method 1 (recommended) - Using navigation.setOptions()
method in your screen component or useHeader()
hook.
This method gives you the most control over your Header and co-locates the logic inside of your screen while preserving react-navigation's optimizations by keeping it outside of the screen component's render lifecycle.
function AccountScreen(props) {
const { navigation } = props
useLayoutEffect(() => {
navigation.setOptions({
headerShown: true,
header: () => <Header title="Hello" />,
})
}, [])
return <Screen />
}
A convenience useHeader
hook is provided that abstracts and cleans up some of this logic.
function AccountScreen(props) {
useHeader({
title: "Hello",
})
return <Screen />
}
Method 2 - Directly in the render of you screen component.
The Header can be rendered directly in your screen's body. This gives you the most control over the Header component at the expense of performance as it is now a part of the screen's render lifecycle.
function AccountScreen(props) {
return (
<View>
<Header title="Hello" />
</View>
)
}
If you prefer this method, it might be a good idea to memoize the component to prevent unnecessary re-renders.
Method 3 - Defining the header in your navigator/screen config.
If your Header shares a lot of the same logic within a navigator, it might be a better solution to set the Header inside the navigator config or navigator's screen config. For any customization between screens, you will still need to set the Header props using navigation.setOptions()
. Additionally, the Header might need to be updated/refactored to use react-navigation's header properties as it isn't very compatible out-of-the-box.
<Stack.Navigator
screenOptions={{
header: (props) => <Header title={props.options.headerTitle ?? props.route.name} />,
}}
/>
Or, you can define it on the screen config.
<Stack.Navigator screenOptions={{ headerShown: false }}>
<Stack.Screen
name="Welcome"
component={WelcomeScreen}
options={{ headerShown: true, header: () => <Header title="Hello" /> }}
/>
</Stack.Navigator>