Введение

React Native позволяет создавать нативные мобильные приложения с помощью JavaScript и React. Критическим аспектом разработки мобильных приложений является навигация: управление пользователями через различные экраны и функции без проблем. React Navigation является самой популярной библиотекой, основанной на сообществе, для реализации навигации в приложениях React Native. Она обеспечивает декларативный API, поддерживает стек, вкладки и навигаторы ящиков и обрабатывает жесты и переходы, специфичные для платформы. Это руководство охватывает все от установки до продвинутых шаблонов, таких как глубокие ссылки и потоки аутентификации.

Предпосылки и установка

Перед использованием React Navigation убедитесь, что у вас есть инициализированный проект React Native. Если вы начинаете свежий, используйте React Native CLI или Expo. React Navigation работает с обоими.

Установите пакеты Core

Установите необходимые пакеты через npm или yarn. Основная библиотека и ее основные зависимости:

npm install @react-navigation/native

Затем установите поддерживающие библиотеки, от которых зависит управление экраном и безопасное управление зоной:

npm install react-native-screens react-native-safe-area-context

Если вы используете Expo, эти библиотеки уже включены. Для проектов React Native, следуйте инструкциям по ссылкам в официальной документации, чтобы убедиться, что нативные модули связаны правильно (автосвязывание обрабатывает это для React Native 0.60 +).

Установите навигатор

Навигатор React Navigation предлагает несколько навигаторов. Навигатор стека рекомендуется для большинства случаев использования:

npm install @react-navigation/native-stack

Другие навигаторы, такие как нижняя вкладка и , устанавливаются отдельно:

npm install @react-navigation/bottom-tabs
npm install @react-navigation/drawer

Основные концепции

React Navigation построена вокруг трех основных блоков:

  • Навигационный контейнер — самая внешняя обертка, управляющая деревом навигации и состоянием.
  • Навигаторы — компоненты, определяющие схему навигации (стек, вкладка, ящик).
  • Screens — отдельные компоненты, которые представляют вид или страницу в приложении.

Каждая навигация должна быть обернута в . Этот контейнер обычно помещается в корневую часть компонента приложения.

Настройка стекового навигатора

Навигатор стека управляет стеком экранов «последний в первом». Он использует переходные анимации и жесты нативной платформы по умолчанию.

Во-первых, импортировать необходимые модули:

import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';

Создайте экземпляр навигатора стека:

const Stack = createNativeStackNavigator();

Определите навигатор внутри компонента приложения:

function App() {
 return (
 <NavigationContainer>
 <Stack.Navigator>
 <Stack.Screen name="Home" component={HomeScreen} />
 <Stack.Screen name="Details" component={DetailsScreen} />
 </Stack.Navigator>
 </NavigationContainer>
 );
}

Каждый требует опоры (используется для навигации) и опоры (компонент React для рендеринга).

Создание экранов и навигация

Экраны являются стандартными компонентами React. Они получают два важных реквизита: и . Объект предоставляет способы перемещения между экранами. Ниже приведен типичный домашний экран:

function HomeScreen({ navigation }) {
 return (
 <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
 <Text>Home Screen</Text>
 <Button
 title="Go to Details"
 onPress={() => navigation.navigate('Details')}
 />
 </View>
 );
}

Экран «Деталь» не должен использовать навигационный реквизит, если ему не нужно перемещаться дальше.

function DetailsScreen({ route }) {
 return (
 <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
 <Text>Details Screen</Text>
 </View>
 );
}

Методы навигации

React Navigation предоставляет несколько методов с помощью :

  • navigate(имя, парам) — перемещается на экран, повторно используя существующий экземпляр, если он существует в стеке.
  • push(имя, парам) — всегда нажимает на стек новый экран, даже если тот же экран уже находится в стеке.
  • goBack() — переходит на предыдущий экран в стеке.
  • заменить (имя, парам) — заменить текущий экран новым, удалив ток из истории.
  • reset(state) — перезагружает всё состояние навигации к заданному объекту состояния.

Например, чтобы нажать новый экземпляр экрана Детали и пропустить параметры:

navigation.push('Details', { itemId: 42, otherParam: 'anything' });

Прохождение параметров между экранами

Данные могут быть переданы на экран через второй аргумент или . Получающий экран получает доступ к этим параметрам через .

// In HomeScreen
navigation.navigate('Details', { userId: 123 });

// In DetailsScreen
function DetailsScreen({ route }) {
 const { userId } = route.params;
 return <Text>User ID: {userId}</Text>;
}

Установите значения параметров по умолчанию, используя на компоненте экрана:

<Stack.Screen
 name="Details"
 component={DetailsScreen}
 initialParams={{ itemId: 0 }}
/>

Конфигурация навигационных опций

Каждый экран может настроить свой заголовок, значок вкладки, ярлык ящика и т. Д., Используя реквизит на или реквизит на навигаторе.

Настройка заголовка

<Stack.Screen
 name="Details"
 component={DetailsScreen}
 options={{
 title: 'Details',
 headerStyle: { backgroundColor: '#f4511e' },
 headerTintColor: '#fff',
 headerTitleStyle: { fontWeight: 'bold' },
 }}
/>

Динамические параметры могут быть установлены с помощью функции, которая получает :

options={({ route }) => ({ title: route.params.name })}

Навигатор Tab

Навигация по вкладкам является общим для секций приложений верхнего уровня. Установите навигатор нижних вкладок:

npm install @react-navigation/bottom-tabs

Создайте навигатор вкладки и объедините его со стеком:

import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';

const Tab = createBottomTabNavigator();

function HomeTabs() {
 return (
 <Tab.Navigator>
 <Tab.Screen name="Feed" component={FeedScreen} />
 <Tab.Screen name="Profile" component={ProfileScreen} />
 </Tab.Navigator>
 );
}

Вы можете вставить навигатор вкладок в навигатор стека или наоборот. Настройте значки вкладок, используя реквизит с .

Навигатор-чертежник

Навигатор выдвигает ящик слева, раскрывая навигационные элементы. Установите его:

npm install @react-navigation/drawer

Пример установки:

import { createDrawerNavigator } from '@react-navigation/drawer';

const Drawer = createDrawerNavigator();

function AppDrawer() {
 return (
 <Drawer.Navigator>
 <Drawer.Screen name="Home" component={HomeScreen} />
 <Drawer.Screen name="Settings" component={SettingsScreen} />
 </Drawer.Navigator>
 );
}

Используйте , чтобы открыть и закрыть ящик программно.

Навигаторы Nested

Сложные приложения часто гнездят навигаторы (например, навигатор вкладок внутри навигатора стека). Реагирование навигация обрабатывает гнездование изящно. Реквизит , предоставленный любому экрану, может вызывать методы на родительском навигаторе, если это необходимо. Используйте для доступа к методам родительского навигатора.

Пример: стек, содержащий навигатор вкладки и экран настроек:

function RootStack() {
 return (
 <Stack.Navigator>
 <Stack.Screen name="Main" component={MainTabs} options={{ headerShown: false }} />
 <Stack.Screen name="Settings" component={SettingsScreen} />
 </Stack.Navigator>
 );
}

Глубокие и глубокие связи

React Navigation поддерживает глубокие ссылки для обработки URL-адресов, которые открывают определенные экраны. Настройте Реквизит :

const linking = {
 prefixes: ['myapp://', 'https://myapp.com'],
 config: {
 screens: {
 Home: 'home',
 Details: 'details/:itemId',
 },
 },
};

<NavigationContainer linking={linking}>
 {/* navigators */}
</NavigationContainer>

Затем обработайте входящие URL-адреса. Это позволяет использовать такие функции, как push-уведомления, ссылающиеся на конкретный экран.

Поток аутентификации

Многие приложения требуют условной навигации на основе состояния аутентификации.Обычным шаблоном является переключение навигатора на корневом уровне:

function App() {
 const [isSignedIn, setIsSignedIn] = useState(false);

 return (
 <NavigationContainer>
 {isSignedIn ? <AppNavigator /> : <AuthNavigator />}
 </NavigationContainer>
 );
}

В качестве альтернативы, используйте один стек с условными экранами. Избегайте мерцания, сохраняя обещание или состояние в актуальном состоянии.

Производительность и лучшие практики

  • Используйте навигатор стека для лучшей производительности и нативных переходов (не ).
  • Минимизируйте количество установленных одновременно экранов. React Navigation по умолчанию размещает скрытые экраны для стековых навигаторов, но для навигаторов вкладок можно настроить ленивую загрузку.
  • Пропускать только примитивные данные через параметры, чтобы избежать проблем с сериализацией.
  • Используйте или для компонентов экрана, которые часто перезаписываются.
  • Избегайте тяжелых вычислений во время переходов навигации; работа с выгрузкой .
  • Вместо этого, введите [[48]], чтобы изменить [[[48]].

Заключение

React Navigation обеспечивает интуитивно понятный, настраиваемый и эффективный способ управления навигацией в приложениях React Native. Овладев стеком, вкладкой, ящиком и вложенными навигаторами, а также потоками прохождения параметров, глубоких ссылок и аутентификации, вы можете создать надежные мобильные интерфейсы. Для получения дополнительной информации обратитесь к официальной документации React Navigation и React Native Navigation Guide. Также рассмотрите возможность чтения статей сообщества о React Navigation best practices для уточнения ваших реализаций.