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.

Related essays

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