Проектирование и Реализация Навигационной Структуры
Данный проект реализует комплексную навигационную систему мобильного приложения кофейни "Coffee Park" с использованием React Navigation. Система включает Stack, Tab и Drawer навигацию с передачей параметров между экранами и кастомной стилизацией.
Приложение использует трехуровневую навигационную архитектуру:
Файл: navigation/AuthStack.jsx
- Назначение: Линейные переходы между экранами авторизации
- Экраны: Login → SignUp
- Связи: Простой переход между входом и регистрацией
Файл: navigation/MainTab.jsx
- Назначение: Быстрый доступ к основным функциям приложения
- Экраны: Home, Cart, OrderStatus, Profile
- Связи: Горизонтальная навигация между основными разделами
Файл: navigation/MainDrawer.jsx
- Назначение: Боковое меню с дополнительными экранами
- Экраны: Main (содержит MainTab), PaymentMethods, SavedLocations, Settings, About
- Связи: Доступ к настройкам и вспомогательным функциям
App.jsx
├── AuthStack (неавторизованные пользователи)
│ ├── LoginScreen
│ └── SignUpScreen
└── MainDrawer (авторизованные пользователи)
├── Main (MainTab)
│ ├── HomeScreen
│ ├── CartScreen
│ ├── OrderStatusScreen
│ └── ProfileScreen
├── PaymentMethodsScreen
├── SavedLocationsScreen
├── SettingsScreen
└── AboutScreen
Файл: navigation/AuthStack.jsx
Особенности реализации:
- Использует
createStackNavigatorдля линейных переходов - Скрытые заголовки (
headerShown: false) для кастомного дизайна - Простая навигация между Login и SignUp
import { createStackNavigator } from '@react-navigation/stack';
import { SCREENS } from './ScreenNames';
const Stack = createStackNavigator();
export default function AuthStack() {
return (
<Stack.Navigator screenOptions={{ headerShown: false }}>
<Stack.Screen name={SCREENS.LOGIN} component={LoginScreen} />
<Stack.Screen name={SCREENS.SIGNUP} component={SignUpScreen} />
</Stack.Navigator>
);
}Файл: navigation/MainTab.jsx
Особенности реализации:
createBottomTabNavigatorдля нижних табов- Кастомные иконки с анимацией (Ionicons)
- Динамический счетчик товаров в корзине
- Адаптивная стилизация под темы
- Поддержка accessibility для web
Ключевые компоненты:
- View, TouchableOpacity - структура табов
- Ionicons - иконки навигации
- Animated - анимации счетчика корзины
- useSelector - подключение к Redux состоянию
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { Ionicons } from '@expo/vector-icons';
import { Animated } from 'react-native';
const Tab = createBottomTabNavigator();
// Анимированный счетчик корзины
tabBarIcon: ({ color, size }) => {
if (route.name === SCREENS.CART) {
return (
<>
<Ionicons name="bag-outline" size={size} color={color} />
{cartItemsCount > 0 && (
<Animated.View style={badgeStyle}>
<Animated.Text>{cartItemsCount}</Animated.Text>
</Animated.View>
)}
</>
);
}
};Файл: navigation/MainDrawer.jsx
Особенности реализации:
createDrawerNavigatorдля бокового меню- Содержит MainTab как основной экран
- Тематическая стилизация
- Поддержка accessibility
- Многоязычные labels
Используемые компоненты:
- View - структура drawer
- Text - labels пунктов меню
- TouchableOpacity - интерактивные элементы
- Platform - платформо-специфичные стили
Файл: screens/ProductsScreen.jsx
// Получение параметра category из navigation
const ProductsScreen = ({ navigation, route }) => {
let category = 'Все';
if (route?.params && typeof route.params.category !== 'undefined') {
category = route.params.category;
}
// Использование категории для фильтрации товаров
const filteredProducts =
category === 'Все'
? products
: products.filter(
(product) =>
product.category === category || product.categoryId === category
);
};Файл: screens/CartScreen.jsx
// Передача данных заказа в OrderStatus
const handleCheckout = async () => {
// ... логика создания заказа
navigation.navigate('OrderStatus', {
orderId: orderResponse.data.id,
orderData: orderResponse.data,
isNewOrder: true,
});
};Файл: components/Categories.jsx
// Передача выбранной категории
const handleCategoryPress = (category) => {
navigation.navigate(SCREENS.PRODUCTS, {
category: category.id,
categoryName: category.name,
});
};| Параметр | Тип | Назначение | Пример |
|---|---|---|---|
category |
string/number | ID выбранной категории | { category: 1 } |
orderId |
string | ID заказа для отслеживания | { orderId: "123" } |
orderData |
object | Полные данные заказа | { orderData: {...} } |
isNewOrder |
boolean | Флаг нового заказа | { isNewOrder: true } |
// AppStack.jsx - Единые стили для всех Stack экранов
<Stack.Navigator
screenOptions={{
headerShown: true,
headerTitleAlign: 'center',
headerStyle: { height: 64 },
headerTitleStyle: {
fontSize: 20,
fontWeight: '500',
textAlign: 'center',
},
}}
>// MainTab.jsx - Темизированные табы
screenOptions={{
tabBarActiveTintColor: theme.brandColor,
tabBarInactiveTintColor: theme.lightText,
tabBarStyle: {
backgroundColor: theme.backgroundColor,
borderTopColor: theme.borderColor,
borderTopWidth: 1,
paddingVertical: 10,
minHeight: 64,
},
}}// MainDrawer.jsx - Тематическое боковое меню
screenOptions={{
drawerStyle: {
backgroundColor: theme.navigationBackgroundColor,
},
drawerActiveTintColor: theme.brandColor,
drawerInactiveTintColor: theme.primaryText,
drawerLabelStyle: {
fontSize: 16,
},
}}- Использует
Animated.Viewдля плавных переходов - Динамически показывает количество товаров
- Поддерживает accessibility labels
- Разные иконки для активного/неактивного состояния
- Платформо-специфичные размеры
- Интеграция с темами приложения
- Использование Redux для переводов
- Динамическое обновление при смене языка
- Fallback на английский язык
- Стандартные iOS жесты для навигации
- Автоматическая интеграция с iOS системной навигацией
- Поддержка Safe Area для iPhone с вырезом
- Материал дизайн принципы
- Поддержка аппаратной кнопки "Назад"
- Elevation для карточек и навигации
- Accessibility атрибуты (
aria-hidden: false) - Поддержка клавиатурной навигации
- Адаптивные размеры для desktop
- Свайп слева направо для открытия
- Свайп справа налево для закрытия
- Tap за пределами меню для закрытия
- Touch для переключения табов
- Анимация при смене активного таба
- Haptic feedback на iOS
// ProductsScreen.jsx - Проверка route.params
if (route?.params && typeof route.params.category !== 'undefined') {
category = route.params.category;
} else if (!route?.params) {
Alert.alert('Ошибка', 'Параметр category не передан!');
}// Безопасная навигация с проверкой
const safeNavigate = (screenName, params = {}) => {
try {
navigation.navigate(screenName, params);
} catch (error) {
console.error('Navigation error:', error);
navigation.navigate('Home'); // Fallback
}
};navigation/
├── ScreenNames.jsx # Константы названий экранов
├── AuthStack.jsx # Стек авторизации
├── AppStack.jsx # Основной стек приложения
├── MainTab.jsx # Табовая навигация
└── MainDrawer.jsx # Drawer навигация
export const SCREENS = {
HOME: 'Home',
CART: 'Cart',
PRODUCTS: 'Products',
PROFILE: 'Profile',
ORDER_STATUS: 'OrderStatus',
SETTINGS: 'Settings',
// ... другие экраны
};Преимущества использования констант:
- ✅ Избежание опечаток в названиях экранов
- ✅ Централизованное управление роутами
- ✅ Простота рефакторинга
- ✅ TypeScript-дружественный подход
- Анализ типов навигации: Stack для авторизации, Tab для основного интерфейса, Drawer для дополнительных функций
- Определены связи экранов: Четкая иерархия и переходы между экранами
- Описаны передаваемые параметры: category, orderId, orderData, и другие
- Stack.Navigator: AuthStack и AppStack для линейных переходов
- Tab.Navigator: MainTab для основных разделов приложения
- Drawer.Navigator: MainDrawer для дополнительных функций
- Интеграция компонентов: Все кастомные компоненты интегрированы в навигацию
- navigation.navigate(): Используется для всех переходов с параметрами
- route.params: Обработка и валидация во всех экранах
- Динамический контент: ProductsScreen фильтрует по категории из параметров
- Кастомные заголовки: Единый стиль для всех Stack экранов
- Стилизованные табы: Тематические цвета и анимации
- Иконки состояний: Активные/неактивные состояния для всех табов
- Кроссплатформенность: iOS, Android, Web поддержка
- Жесты: Drawer свайпы, Tab touches
- Обработка ошибок: Валидация параметров и безопасная навигация
- Модульность: Все навигаторы в отдельных файлах
- Документация: Подробные комментарии в коде
- Константы: SCREENS для всех названий экранов
- Чистота кода: Консистентный стиль и архитектура
auth-stack-login.png- Экран входа (AuthStack)main-tab-navigation.png- Нижняя табовая навигацияdrawer-menu-open.png- Открытое боковое менюstack-navigation-transition.png- Переход между экранами Stackcart-badge-animation.png- Анимированный счетчик корзиныcategory-navigation.png- Навигация с передачей параметровnavigation-themes.png- Навигация в разных темах
- Запустите приложение:
npm start - Протестируйте все типы переходов
- Проверьте передачу параметров
- Убедитесь в работе жестов
- Протестируйте на разных платформах
Проект: Coffee Park App
Навигация: React Navigation v6
Архитектура: Stack + Tab + Drawer
Платформы: iOS, Android, Web