Skip to content
All essays
iOSJanuary 30, 202511 min

React Native Navigation: Complete Guide to Mobile Navigation

Master navigation in React Native using React Navigation. Learn stacks, tabs, drawers, and deep linking.

Ü
Ümit Uz
Mobile & Full Stack Developer

Installation

bash
npm install @react-navigation/native
npm install @react-navigation/native-stack
npm install @react-navigation/bottom-tabs

Stack 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>
  );
}
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>
  );
}

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

  1. 1Keep navigation prop minimal: Don't pass it deeply
  2. 2Use navigation hooks: Prefer hooks over props
  3. 3Organize navigation: Separate concerns
  4. 4Handle edge cases: Back button, deep links
  5. 5Test navigation: Ensure all flows work

Conclusion

React Navigation provides flexible navigation solutions. Choose the right pattern for your app's needs.

Enjoyed this essay? Share it.

Related essays

Next essay
React Native Complete Guide: Build Cross-Platform Apps