React Router, изначально разработанный для веб-приложений, обладает гибкостью, позволяющей интегрироваться с нативной навигацией в мобильных приложениях на базе React Native. Основная цель — обеспечить согласованное управление состоянием навигации, маршрутизацией и историей переходов в приложении, используя привычные компоненты и хуки.
Для работы с React Router в нативной среде используются те же принципы маршрутизации, но с акцентом на компоненты, поддерживающие мобильную навигацию. Ключевые элементы:
NativeRouter Аналог
BrowserRouter в вебе, но предназначенный для нативной
среды. Оборачивает корневой компонент приложения, обеспечивая работу
маршрутов и истории:
import { NativeRouter } from 'react-router-native';
export default function App() {
return (
{/* маршруты и навигация */}
);
}Route Позволяет определить
компоненты для конкретного пути. Поддерживает динамические параметры и
вложенные маршруты:
import { Route } from 'react-router-native';
Link и Redirect
Link используется для перехода между маршрутами без
перезагрузки, Redirect — для программного
перенаправления:
import { Link, Redirect } from 'react-router-native';
Домой
// Программный редирект
Нативная навигация требует управления стеком экранов и истории переходов. В React Router для этого используются хуки:
useNavigate Возвращает функцию для
программной навигации:
import { useNavigate } from 'react-router-native';
function ProfileButton() {
const navigate = useNavigate();
const goToProfile = () => {
navigate('/profile/42');
};
return ;
}useLocation Позволяет получить
текущий путь и состояние навигации:
import { useLocation } from 'react-router-native';
const location = useLocation();
console.log(location.pathname); // текущий путьuseParams Получение динамических
параметров маршрута:
import { useParams } from 'react-router-native';
function ProfileScreen() {
const { id } = useParams();
return ID профиля: {id} ;
}React Router поддерживает вложенные маршруты, что особенно полезно для реализации табов и навигации по стеку экранов:
}>
} />
} />
В мобильной среде каждый вложенный маршрут можно рассматривать как
отдельный экран, управляемый стеком навигации. Использование
* в пути позволяет захватывать все вложенные маршруты.
Иногда необходимо комбинировать React Router с React Navigation или другими библиотеками, предоставляющими нативные элементы интерфейса, такие как табы или боковые меню:
Обертка экранов Вложенные маршруты React Router можно использовать внутри экранов React Navigation, сохраняя управление состоянием навигации в одном месте.
События навигации Реагирование на аппаратные
кнопки «назад» на Android возможно через слушатели
BackHandler в сочетании с useNavigate для
корректного возврата по стеку:
import { BackHandler } from 'react-native';
import { useNavigate } from 'react-router-native';
import { useEffect } from 'react';
const navigate = useNavigate();
useEffect(() => {
const onBackPr ess = () => {
navigate(-1); // возврат на предыдущий экран
return true; // предотвращает закрытие приложения
};
BackHandler.addEventListener('hardwareBackPress', onBackPress);
return () => BackHandler.removeEventListener('hardwareBackPress', onBackPress);
}, []);Каждое приложение нуждается в передаче состояния между экранами. React Router позволяет это делать через состояние навигации:
navigate('/profile', { state: { fromDashboard: true } });
const location = useLocation();
console.log(location.state.fromDashboard); // true
Это облегчает реализацию сценариев, где необходимо передавать контекст между экранами без использования глобального состояния.
Для больших приложений на мобильных устройствах важно использовать ленивую загрузку экранов, чтобы минимизировать время старта и нагрузку на память:
import { Suspense, lazy } from 'react';
import { Route } from 'react-router-native';
const HomeScreen = lazy(() => import('./HomeScreen'));
const ProfileScreen = lazy(() => import('./ProfileScreen'));
Загрузка...}>
} />
} />
Использование Suspense позволяет отложить рендеринг
компонентов до их полной загрузки, что критично для мобильных устройств
с ограниченными ресурсами.
Хотя React Router не предоставляет встроенные анимации переходов,
комбинация с Animated API React Native
позволяет реализовать плавные переходы между экранами. Основной
подход:
useLocation.Animated.View.NativeRouter для корневого
компонента приложения.useNavigate и
обрабатывать аппаратные кнопки.lazy и
Suspense, чтобы снизить время старта и потребление
памяти.