Нижня навігація
Навігацію в застосунку можна виконати використовуючи верхні чи нижні таби. Розглянемо на прикладі нижньої навігації.
На додачу до раніше встановлених бібліотек маршрутизації потрібно встановити ще цей пакет.
Припустимо, що ми створили з нуля новий додаток і налаштували в ньому перемикання між трьома скрінами, які поки реалізуємо, як функціональні компоненти всередині нашого ж головного компонента MyTabs.js. В App.js також потрібно налаштувати маршрутизацію. На цьому етапі на базовому рівні перемикання екранів уже працює.
Розберемо компонент MyTabs.js.
Підключаємо createBottomTabNavigator.
Створюємо Tab.
Home, Settings і Info це просто компоненти, які відображатимуться на екрані при натисканні тієї чи іншої кнопки на нижньому меню. Можна реалізувати. компонентами в окремих файлах і просто заімпортувати згори.
Компонент MyTabs. У ньому реалізуємо нашу навігацію. Він експортується і підключається в App.js
В компонент Tab.Navigator огортаємо наші кнопки нижнього меню.
Компонент Tab.Screen описує послідовно кнопки нашого нижнього меню. Він як мінімум приймає два пропси. name - назва кнопки. При цьому ця ж назва буде відображатися в хедері. component - компонент, який буде відображатися при його натисканні.
Пропси (для компонентів Tab.Navigator та Tab.Screen)
Детальний опис пропсів наведено в офіційній документації.
id - опціональний проп для роботи з навігацією.
initialRouteName - імʼя роута, який буде завантажуватись першим(за замовчанням першим завантажиться той, який в порядку перший). Припустимо, першим хочемо завантажити роут Settings, тоді код буде таким.
screenOptions - налаштування вигляду нижнього меню. Докладніше розглянуто нижче.
backBehavior - працює з кнопкою назад або жестом назад.
detachInactiveScreens - використовується для позначення неактивних екранів. За замовчанням true.
sceneContainerStyle - Об’єкт стилю для компонента, що обгортає вміст екрана.
!!!! Поки розбираюся, як воно працює, тому цей шматок можливо доповниться
Опції (параметри для пропсів screenOptions та options)
title - варіант присвоєння тексту заголовку (і відповідно назви кнопки)
tabBarLabel - Назва лейбла закладки на нижній навігації. Але не змінює напису Хедера.
tabBarShowLabel - чи показувати підписи закладинок.
tabBarLabelPosition - розміщення підпису (лейбла) іконки закладинки. За замовчанням визначається автоматично в залежності від розмірів екрана пристрою. Може бути below-icon (знизу іконки), beside-icon (збоку від іконки).
tabBarLabelStyle - стиль підпису іконки (обʼєкт стилів)
tabBarIcon - функція, якій передають { focused: boolean, color: string, size: number } і яка повертає React.Node для показу в нижньому меню. Наприклад, ми хочемо міняти іконку в залежності у фокусі закладника чи ні.
А якщо, наприклад прописати такі налаштування, то при фокусі буде мінятися іконка, збільшуватися в розмірі та міняти колір із зеленого на червоний.
tabBarIconStyle - стиль блоку іконки (обʼєкт стилів)
tabBarBadge - бейджик для кнопки. Кружечок чи овал у верхньому правому куті іконки. Приймає значення число чи рядок.
tabBarBadgeStyle - стиль бейджика (обʼєкт стилів)
tabBarAccessibilityLabel - мітка доступності, яка читається скрінрідерами.
tabBarTestID - Ідентифікатор для пошуку цієї кнопки вкладки в тестах.
tabBarButton - Функція, яка повертає React-елемент для відтворення як кнопки панелі вкладок. Він огортає піктограму та мітку. За замовчуванням рендериться як Pressable. Ви можете вказати спеціальну реалізацію тут:
!!!! Поки розбираюся, як воно працює, тому цей шматок доповниться
tabBarActiveTintColor - встановлює колір іконки і тексту активної вкладинки.
tabBarInactiveTintColor - встановлює колір іконки і тексту неактивної вкладинки.
tabBarActiveBackgroundColor - встановлює колір фону активної вкладинки.
tabBarInactiveBackgroundColor - встановлює колір фону активної вкладинки.
tabBarHideOnKeyboard - приховування панелі вкладок, коли відкривається клавіатура. За замовчуванням значення false.
tabBarItemStyle - стиль обʼєкта однієї закладинки.
tabBarBackground - Функція повертає Reit-елемент щоб використовувати як бекграунд для всієї панелі меню. Можна зарендерити картинку, градієнт і розмиття.
lazy - Чи має цей екран відображатися під час першого доступу. За замовчуванням значення true. Встановіть значення false, якщо ви хочете відобразити екран початкового рендерингу.
unmountOnBlur - Чи слід відключати цей екран під час переходу з нього. Демонтування екрана скидає будь-який локальний стан на екрані, а також стан вкладених навігаторів на екрані. За замовчуванням значення false.
Не рекомендовано вмикати цей параметр, оскільки користувачі не очікують, що їх історія навігації буде втрачена під час перемикання вкладок. Якщо таки вирішите ввімкнути цю опцію, подумайте, чи справді це забезпечить кращий досвід для користувача.
freezeOnBlur - Набуває булеве значення. Вказує чи потрібно запобігати повторному рендерингу неактивних екранів. За замовчуванням значення false. За замовчуванням значення true, коли enableFreeze() із пакета react-native-screens імпортовано у верхній частині програми.
Потрібна версія react-native-screens >=3.16.0.
Підтримується лише на iOS і Android.
Хедер і повʼязані опції
header - Спеціальний заголовок для використання замість заголовка за умовчанням.
Приймає функцію, яка повертає React-елемент для відображення як заголовок. Функція отримує в якості аргументу об’єкт, що містить такі властивості:
navigation - об'єкт навігації для поточного екрана.
route - об'єкт маршруту для поточного екрана.
options - параметри для поточного екрана
layout - Розміри екрана, містить властивості висоти (height) та ширини (width).
Далі приклад із офіційної документації (не перевіряв, мабуть легше стандартний хедер сховати і власний хедер прописати)
headerShown - використовуємо для показу чи приховування хедера.
Події (Events)
tabPress - обробляє натиск на кнопку.
tabLongPress - обробляє довготривалий натиск на кнопку.
Хелпери
Навігатор вкладок додає наступний методи до проп навігації.
ПРАКТИЧНІ ПРИКЛАДИ НИЖНЬОГО МЕНЮ
На наступних прикладах розберемо деякі вищезгадані налаштування і подивимося кастомізовані нижні меню. Це важливо, бо в офіційній документації вкрай мало прикладів і пояснень кастомізації.
Приклад нижнього меню зі стилізацією кожного окремого табу навігації (в Tab.Screen)
Розберемо цей приклад покроково.
Загальні налаштування для всіх табів Tab.Navigator:
Тут для всіх табів вимикаємо показ підписів під іконками. Закоменчене налаштування показу хедера. Якщо хочемо його приховати для всіх скрінів, то треба його розкоментувати. У налаштуванні tabBarStyle задані загальний стиль для нижнього меню табів.
Налаштування зовнішнього вигляду і поведінки табу для першого скріна:
Тут задаємо колір активної і неактивної іконки. Найбільше цікавить синтаксис tabBarIcon. Як було сказано раніше це функція, яка приймає пропси focused, color і size, і може формувати в зележності від цих даних зовнішній вигляд наших іконок. У прикладі неявне повернення. Давайте трохи (просто для наочності) підправимо наш код, щоб переконатися, що приходить в пропсах.
Налаштування зовнішнього вигляду і поведінки табу для третього скріна:
Далі логічніше передивитися налаштування табу третього скріна. Як видно в попередньому прикладі ми ніяк не обробляли проп фокусу. Тож тут ми будемо міняти в залежності від фокусу скріна нашу іконку (обведенну на залиту). А також можна міняти і розмір самої іконки (давайте із 25 до 35 пікселів).
Налаштування зовнішнього вигляду і поведінки табу для другого скріна:
у цьому прикладі ускладнимо кнопку. Окрім зміни кольору і іконки при її фокусі додамо фоновий овал, який теж буде змінювати колір при фокусі. Тут задамо і колір неактивних іконок для інших табів. В налаштуваннях tabBarIcon описуємо в перемінних колір іконки і колір бекграуну. Назву іконки не визначаємо в перемінну, бо іконки з різних бібліотек, тому ми будемо формувати повністю весь компонент іконки в залежності від фокусу. Рендериться по суті стилізований View із тернарним вибором іконки в залежності від фокусу.
Приклад нижнього меню зі стилізацією табів навігації (в Tab.Navigator)
В даному прикладі у Tab.Screen ми лишаємо лише пропи name i component, які відповідно містять назву скріна і компонент, який завантажиться. Всі інші налаштування робимо в Tab.Navigator. Ось шаблон на який нарощуватимемо налаштування.
В проп screenOptions можна вписати анонімну функцію, яка повертатиме обʼєкт налаштувань.
Давайте дізнаємося, які параметри вона має.
Для кожного Tab.Screen cформуєтсья такий обʼєкт пропсів (в даному прикладі три штуки для Feed, Notifications і Profile:
Тут нас цікавить проп route (і відповідно його параметр name). І ми можемо по цьому імені сформувати кожну кнопку табу. Просто буде перевірятися збіг імені. А застилізуємо по прикладу як це було вище використавуючи tabBarIcon (яка також є колбек функцією - дивись приклад раніше ). І отримаємо такий код:
Тепер приберемо підписи табів, а також хедер і застилізуємо відступи табів. Тобто запишемо в обʼєкт screenOptions, який повертається такий код:
Ну і насамкінець давайте зробимо так, щоб, дві бокові кнопки не версталися, якшо ми вибираємо скрін центральної кнопки.
КАСТОМНІ ХЕДЕРИ
Посилання на офіційну документацію:
Last updated