Installation
bash
npm install @react-navigation/native
npm install @react-navigation/native-stack
npm install @react-navigation/bottom-tabsStack Navigation
Basic Setup
javascript
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
const Stack = createNativeStackNavigator();
function App() {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="Home">
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
</NavigationContainer>
);
}Navigation
javascript
import { useNavigation } from '@react-navigation/native';
function HomeScreen() {
const navigation = useNavigation();
return (
<Button
title="Go to Details"
onPress={() => navigation.navigate('Details')}
/>
);
}Passing Parameters
javascript
// Navigate with params
navigation.navigate('Details', {
itemId: 86,
title: 'My Title',
});
// Access params
function DetailsScreen({ route }) {
const { itemId, title } = route.params;
return <Text>{title}: {itemId}</Text>;
}Tab Navigation
Bottom Tabs
javascript
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
const Tab = createBottomTabNavigator();
function MyTabs() {
return (
<Tab.Navigator>
<Tab.Screen name="Home" component={HomeScreen} />
<Tab.Screen name="Settings" component={SettingsScreen} />
</Tab.Navigator>
);
}Tab Icons
javascript
import { Ionicons } from '@expo/vector-icons';
<Tab.Screen
name="Home"
component={HomeScreen}
options={{
tabBarLabel: 'Home',
tabBarIcon: ({ color, size }) => (
<Ionicons name="home" color={color} size={size} />
),
}}
/>Drawer Navigation
javascript
import { createDrawerNavigator } from '@react-navigation/drawer';
const Drawer = createDrawerNavigator();
function MyDrawer() {
return (
<Drawer.Navigator>
<Drawer.Screen name="Home" component={HomeScreen} />
<Drawer.Screen name="Profile" component={ProfileScreen} />
</Drawer.Navigator>
);
}Navigation Options
Header Customization
javascript
<Stack.Screen
name="Details"
component={DetailsScreen}
options={{
title: 'My Details',
headerStyle: { backgroundColor: '#f4511e' },
headerTintColor: '#fff',
headerTitleStyle: { fontWeight: 'bold' },
}}
/>Dynamic Header
javascript
<Stack.Screen
name="Details"
component={DetailsScreen}
options={({ route }) => ({
title: route.params.title,
})}
/>Hide Header
javascript
options={{ headerShown: false }}Nested Navigation
javascript
function Root() {
return (
<Tab.Navigator>
<Tab.Screen name="Home" component={HomeStack} />
<Tab.Screen name="Settings" component={SettingsStack} />
</Tab.Navigator>
);
}
function HomeStack() {
return (
<Stack.Navigator>
<Stack.Screen name="Home" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
);
}Deep Linking
Configuration
javascript
const linking = {
prefixes: ['myapp://'],
config: {
screens: {
Home: 'home',
Details: 'details/:id',
},
},
};
<NavigationContainer linking={linking}>
{/* ... */}
</NavigationContainer>Best Practices
- 1Keep navigation prop minimal: Don't pass it deeply
- 2Use navigation hooks: Prefer hooks over props
- 3Organize navigation: Separate concerns
- 4Handle edge cases: Back button, deep links
- 5Test navigation: Ensure all flows work
Conclusion
React Navigation provides flexible navigation solutions. Choose the right pattern for your app's needs.