10. React Navigation: Введение
React Navigation — стандартная библиотека навигации для React Native. Поддерживает Stack, Tab, Drawer навигаторы и их комбинации.
Установка
Заголовок раздела «Установка»# Базовые зависимостиnpx expo install @react-navigation/native
# Зависимости для Exponpx expo install react-native-screens react-native-safe-area-context
# Навигаторы (устанавливай нужные)npx expo install @react-navigation/native-stack # Stacknpx expo install @react-navigation/bottom-tabs # Tabsnpx expo install @react-navigation/drawer # DrawerСтруктура навигации
Заголовок раздела «Структура навигации»// App.tsx — корневой файлimport { NavigationContainer } from '@react-navigation/native';import { createNativeStackNavigator } from '@react-navigation/native-stack';
const Stack = createNativeStackNavigator();
export default function App() { return ( <NavigationContainer> <Stack.Navigator> <Stack.Screen name="Home" component={HomeScreen} /> <Stack.Screen name="Details" component={DetailsScreen} /> </Stack.Navigator> </NavigationContainer> );}Навигация между экранами
Заголовок раздела «Навигация между экранами»// В компоненте экранаimport { useNavigation } from '@react-navigation/native';
export default function HomeScreen() { const navigation = useNavigation();
return ( <TouchableOpacity onPress={() => navigation.navigate('Details', { id: 42 })} > <Text>Открыть детали</Text> </TouchableOpacity> );}Получение параметров
Заголовок раздела «Получение параметров»import { useRoute } from '@react-navigation/native';
export default function DetailsScreen() { const route = useRoute(); const { id } = route.params; // Параметры из navigate()
return <Text>ID: {id}</Text>;}TypeScript типизация
Заголовок раздела «TypeScript типизация»export type RootStackParamList = { Home: undefined; Details: { id: number; title?: string }; Profile: { userId: string };};
// В навигатореconst Stack = createNativeStackNavigator<RootStackParamList>();
// В компонентеimport { NativeStackNavigationProp } from '@react-navigation/native-stack';
type HomeScreenNavigationProp = NativeStackNavigationProp< RootStackParamList, 'Home'>;
const navigation = useNavigation<HomeScreenNavigationProp>();Expo Router — альтернатива
Заголовок раздела «Expo Router — альтернатива»Expo Router использует файловую систему вместо конфигурации:
app/├── index.tsx → /├── details/[id].tsx → /details/123├── (tabs)/│ ├── _layout.tsx → Tab навигация│ ├── home.tsx → /home│ └── settings.tsx → /settings└── modal.tsx → /modalimport { useLocalSearchParams } from 'expo-router';
export default function Details() { const { id } = useLocalSearchParams(); return <Text>ID: {id}</Text>;}
// Навигацияimport { Link, router } from 'expo-router';
<Link href="/details/42">Детали</Link>router.push('/details/42');router.back();Hooks навигации
Заголовок раздела «Hooks навигации»const navigation = useNavigation();const route = useRoute();const isFocused = useIsFocused(); // Экран в фокусе?const focus = useFocusEffect(callback); // Вызов при фокусе
// Lifecycle событияuseEffect(() => { const unsubscribe = navigation.addListener('focus', () => { // Экран стал видимым }); return unsubscribe;}, [navigation]);