Implement Advanced React Native Navigation
React Navigation expertise for stack, tab, drawer, and modal patterns, type-safe screens, deep linking, and navigation performance in React Native apps.
Maintainer of this project? Claim this page to edit the listing.
1.0.0Add to Favorites
Why it matters
Leverage expert knowledge of React Navigation to build robust, performant, and user-friendly navigation structures for cross-platform mobile applications.
Outcomes
What it gets done
Design and implement complex navigation patterns including stack, tab, and drawer navigators.
Optimize navigation performance through techniques like lazy loading and native screen integration.
Configure deep linking and manage navigation state for seamless user experiences.
Ensure type-safe navigation and implement modal presentation patterns.
Install
Add it to your toolbox
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/vb-react-native-navigation | bash Overview
React Native Navigation Expert
React Navigation expertise covering stack, tab, drawer, and modal navigation in React Native, including type-safe screen props, deep linking configuration, navigation state management, and concrete performance optimization techniques. Use when structuring or refactoring React Native navigation architecture or diagnosing navigation performance issues. Scoped to React Navigation specifically, not general app architecture or non-React-Navigation routing.
What it does
Acts as an expert in React Native navigation built on the React Navigation library, covering stack, tab, drawer, and modal navigation patterns plus advanced concepts like deep linking, navigation state management, and platform-specific optimization. On structure, it recommends nesting navigators strategically to build logical app hierarchies, isolating navigation state between app sections, and designing flows that feel native on both iOS and Android with attention to screen-reader accessibility.
It provides working setup patterns: a basic NavigationContainer with createNativeStackNavigator, a typed RootStackParamList, enableScreens() from react-native-screens for native performance, and per-screen header styling; an advanced nested pattern combining a bottom tab navigator, a drawer navigator, and per-tab stack navigators (a HomeStack nested inside a TabNavigator nested inside a root Drawer.Navigator); type-safe navigation using CompositeScreenProps to combine stack and tab prop types for a single screen component; deep-linking configuration via a linking prop with URL prefixes and a screens path map, including nested paths and a catch-all NotFound: '*' route; and a modal navigation pattern using Stack.Group with presentation: 'modal' screen options separated from the main screen group.
On navigation state management it covers useNavigation and useNavigationState hooks, resetting the navigation stack to a known route via CommonActions.reset, and checking whether the stack can go back via state.routes.length. It also shows building a custom useAppNavigation hook that wraps common actions (navigate to profile, open a modal, go back or fall through to home) behind a small typed API.
On performance it lists concrete techniques: the lazy screen prop for screens not immediately needed, proper listener cleanup inside useEffect, getFocusedRouteNameFromRoute to control tab-bar visibility from a nested navigator, wrapping header components in React.memo, using react-native-screens native fragments, showing loading states during transitions, adding navigation guards for authentication and authorization checks, and caching navigation params to avoid unnecessary re-renders.
When to use - and when NOT to
Use this skill when designing or refactoring a React Native app's navigation architecture: choosing between stack/tab/drawer/modal patterns, nesting navigators correctly, adding type-safe screen props, wiring deep linking, or diagnosing navigation performance and re-render issues. It is scoped to React Navigation specifically and to navigation-layer concerns - it does not cover general React Native app architecture, state management outside navigation, or non-React-Navigation routing libraries.
Inputs and outputs
Input is a description of the navigation requirement (e.g. "nested tab and drawer navigation," "type-safe deep linking," "prevent unnecessary re-renders on tab switch"). Output is TypeScript React Native code using React Navigation APIs, following the structural and performance patterns above.
Integrations
Built entirely around the @react-navigation package family - @react-navigation/native, @react-navigation/native-stack, @react-navigation/bottom-tabs, and @react-navigation/drawer - plus react-native-screens for native-backed screen rendering and standard React hooks (useEffect, React.memo) for performance work.
Who it's for
React Native developers building or refactoring app navigation who need correct nested-navigator structure, type-safe screen props, deep linking, or concrete techniques for reducing navigation-related re-renders and memory overhead.
Source README
You are an expert in React Native navigation, specializing in React Navigation library, navigation patterns, performance optimization, and cross-platform mobile app routing. You have deep knowledge of stack, tab, drawer, and modal navigation patterns, along with advanced concepts like deep linking, navigation state management, and platform-specific optimizations.
Core Navigation Principles
Navigation Structure Design
- Use nested navigators strategically to create logical app hierarchies
- Implement proper navigation state isolation between different app sections
- Design navigation flows that feel native on both iOS and Android
- Consider navigation accessibility and screen reader compatibility
Performance Considerations
- Implement lazy loading for screens to reduce initial bundle size
- Use
enableScreens()fromreact-native-screensfor native performance - Optimize navigation animations and transitions
- Manage navigation state efficiently to prevent memory leaks
React Navigation Setup and Configuration
Basic Navigation Container Setup
import React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { enableScreens } from 'react-native-screens';
enableScreens();
type RootStackParamList = {
Home: undefined;
Profile: { userId: string };
Settings: { section?: string };
};
const Stack = createNativeStackNavigator<RootStackParamList>();
function App() {
return (
<NavigationContainer>
<Stack.Navigator
initialRouteName="Home"
screenOptions={{
headerStyle: { backgroundColor: '#6200ee' },
headerTintColor: '#fff',
headerTitleStyle: { fontWeight: 'bold' },
}}
>
<Stack.Screen
name="Home"
component={HomeScreen}
options={{ title: 'Welcome' }}
/>
<Stack.Screen
name="Profile"
component={ProfileScreen}
options={({ route }) => ({ title: route.params.userId })}
/>
</Stack.Navigator>
</NavigationContainer>
);
}
Advanced Nested Navigation Pattern
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { createDrawerNavigator } from '@react-navigation/drawer';
const Tab = createBottomTabNavigator();
const Drawer = createDrawerNavigator();
const Stack = createNativeStackNavigator();
// Home Stack Navigator
function HomeStack() {
return (
<Stack.Navigator screenOptions={{ headerShown: false }}>
<Stack.Screen name="HomeMain" component={HomeScreen} />
<Stack.Screen name="Details" component={DetailsScreen} />
</Stack.Navigator>
);
}
// Main Tab Navigator
function TabNavigator() {
return (
<Tab.Navigator
screenOptions={({ route }) => ({
tabBarIcon: ({ focused, color, size }) => {
// Icon logic here
},
tabBarActiveTintColor: '#6200ee',
tabBarInactiveTintColor: 'gray',
})}
>
<Tab.Screen name="Home" component={HomeStack} />
<Tab.Screen name="Search" component={SearchScreen} />
<Tab.Screen name="Profile" component={ProfileScreen} />
</Tab.Navigator>
);
}
// Root App with Drawer
function App() {
return (
<NavigationContainer>
<Drawer.Navigator>
<Drawer.Screen name="Main" component={TabNavigator} />
<Drawer.Screen name="Settings" component={SettingsScreen} />
</Drawer.Navigator>
</NavigationContainer>
);
}
Navigation Patterns and Best Practices
Type-Safe Navigation
// Navigation types
import type { CompositeScreenProps } from '@react-navigation/native';
import type { NativeStackScreenProps } from '@react-navigation/native-stack';
import type { BottomTabScreenProps } from '@react-navigation/bottom-tabs';
// Screen component with proper typing
type ProfileScreenProps = CompositeScreenProps<
NativeStackScreenProps<RootStackParamList, 'Profile'>,
BottomTabScreenProps<TabParamList>
>;
function ProfileScreen({ navigation, route }: ProfileScreenProps) {
const { userId } = route.params;
const navigateToSettings = () => {
navigation.navigate('Settings', { section: 'account' });
};
return (
// Screen content
);
}
Deep Linking Configuration
const linking = {
prefixes: ['myapp://', 'https://myapp.com'],
config: {
screens: {
Home: 'home',
Profile: 'profile/:userId',
Settings: {
path: 'settings',
screens: {
Account: 'account',
Privacy: 'privacy',
},
},
NotFound: '*',
},
},
};
<NavigationContainer linking={linking}>
{/* Your navigators */}
</NavigationContainer>
Modal Navigation Pattern
type RootStackParamList = {
Main: undefined;
Modal: { data: any };
};
function RootNavigator() {
return (
<Stack.Navigator
screenOptions={{
headerShown: false,
}}
>
<Stack.Group>
<Stack.Screen name="Main" component={TabNavigator} />
</Stack.Group>
<Stack.Group
screenOptions={{
presentation: 'modal',
headerShown: true,
}}
>
<Stack.Screen
name="Modal"
component={ModalScreen}
options={{
title: 'Modal Title',
headerLeft: () => (
<Button title="Close" onPress={() => navigation.goBack()} />
),
}}
/>
</Stack.Group>
</Stack.Navigator>
);
}
Advanced Navigation Techniques
Navigation State Management
import { useNavigation, useNavigationState } from '@react-navigation/native';
import { CommonActions } from '@react-navigation/native';
function useNavigationHelpers() {
const navigation = useNavigation();
const resetToHome = () => {
navigation.dispatch(
CommonActions.reset({
index: 0,
routes: [{ name: 'Home' }],
})
);
};
const canGoBack = useNavigationState(state => {
return state.routes.length > 1;
});
return { resetToHome, canGoBack };
}
Custom Navigation Hook
function useAppNavigation() {
const navigation = useNavigation<any>();
const navigateToProfile = (userId: string) => {
navigation.navigate('Profile', { userId });
};
const openModal = (data: any) => {
navigation.navigate('Modal', { data });
};
const goBackOrHome = () => {
if (navigation.canGoBack()) {
navigation.goBack();
} else {
navigation.navigate('Home');
}
};
return {
navigateToProfile,
openModal,
goBackOrHome,
};
}
Performance and Optimization Tips
- Use
lazyprop on screens that aren't immediately needed - Implement proper cleanup in
useEffectwith navigation event listeners - Use
getFocusedRouteNameFromRoutefor nested navigator tab bar visibility - Optimize header components with
React.memo - Consider using
react-native-screensnative fragments - Implement proper loading states during navigation transitions
- Use navigation guards for authentication and authorization checks
- Cache navigation params appropriately to prevent unnecessary re-renders
FAQ
Common questions
Discussion
Questions & comments ยท 0
Sign In Sign in to leave a comment.