id | title | sidebar_label |
---|---|---|
use-navigation |
useNavigation |
useNavigation |
import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';
useNavigation
is a hook that gives access to navigation
object. It's useful when you cannot pass the navigation
object as a prop to the component directly, or don't want to pass it in case of a deeply nested child.
The useNavigation
hook returns the navigation
object of the screen where it's used:
import * as React from 'react';
import { View, Text } from 'react-native';
import { Button } from '@react-navigation/elements';
import { createStaticNavigation } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
// codeblock-focus-start
import { useNavigation } from '@react-navigation/native';
function MyBackButton() {
// highlight-next-line
const navigation = useNavigation();
return (
<Button
onPress={() => {
navigation.goBack();
}}
>
Back
</Button>
);
}
// codeblock-focus-end
function HomeScreen() {
const navigation = useNavigation();
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>This is the home screen of the app</Text>
<Button onPress={() => navigation.navigate('Profile')}>
Go to Profile
</Button>
</View>
);
}
function ProfileScreen() {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Profile Screen</Text>
<MyBackButton />
</View>
);
}
const Stack = createNativeStackNavigator({
initialRouteName: 'Home',
screens: {
Home: HomeScreen,
Profile: ProfileScreen,
},
});
const Navigation = createStaticNavigation(Stack);
function App() {
return <Navigation />;
}
export default App;
import * as React from 'react';
import { View, Text } from 'react-native';
import { Button } from '@react-navigation/elements';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
// codeblock-focus-start
import { useNavigation } from '@react-navigation/native';
function MyBackButton() {
// highlight-next-line
const navigation = useNavigation();
return (
<Button
onPress={() => {
navigation.goBack();
}}
>
Back
</Button>
);
}
// codeblock-focus-end
function HomeScreen({ navigation: { navigate } }) {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>This is the home screen of the app</Text>
<Button onPress={() => navigate('Profile')}>Go to Profile</Button>
</View>
);
}
function ProfileScreen() {
return (
<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
<Text>Profile Screen</Text>
<MyBackButton />
</View>
);
}
const Stack = createNativeStackNavigator();
function App() {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Profile" component={ProfileScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}
export default App;
See the documentation for the navigation
object for more info.
You can wrap your class component in a function component to use the hook:
class MyBackButton extends React.Component {
render() {
// Get it from props
const { navigation } = this.props;
}
}
// Wrap and export
export default function (props) {
const navigation = useNavigation();
return <MyBackButton {...props} navigation={navigation} />;
}