sidebar_position |
---|
34 |
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" }}
/>
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.
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" }} />
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" }} />
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" }} />
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 }} />
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" />
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()} />
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()} />
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()}
/>
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()} />
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()}
/>
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()} />
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()} />
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()}
/>
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>} />
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()} />
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()} />
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"
/>
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()} />
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()} />
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()}
/>
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>} />
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()} />
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={[]} />
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 />
}
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.
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>