Skip to content

Bottom tabs-навигатор

createVirentiaBottomTabsNavigator строит навигатор @react-navigation/bottom-tabs и возвращает компонент { Navigator }. Он следует за открытием роутов так же, как stack-навигатор, и добавляет одну вещь: нажатие на вкладку открывает роут этой вкладки внутри скоупа Virentia.

Настройка — провайдеры, history и представления роутов — общая и описана в обзоре React Native.

tsx
import { createVirentiaBottomTabsNavigator } from "@virentia/router-react-native";
import { router, homeRoute, searchRoute } from "./router";
import { HomeScreen, SearchScreen } from "./screens";

const { Navigator } = createVirentiaBottomTabsNavigator({
  router,
  routes: [
    { route: homeRoute, view: HomeScreen },
    { route: searchRoute, view: SearchScreen },
  ],
  initialRouteName: "home",
});

Нажатие на вкладку проходит через route.open

Так как нажатие на вкладку вызывает route.open, проверки роута, beforeOpen и отслеживание query — все отрабатывают тем же путем, что и при открытии роута откуда угодно. Вкладка не просто меняет видимый экран; она меняет состояние роутера, поэтому остальная часть приложения остается согласованной.

Роуты без события open (обычное представление, которое не является открываемым роутом) откатываются к поведению вкладок React Navigation по умолчанию.

Открытие вкладок с параметрами

Вкладка-роут, которой нужны параметры или query, несет openPayload, передаваемый в route.open при нажатии на вкладку. Используйте значение для статичного payload или функцию для payload, вычисляемого в момент нажатия:

tsx
const { Navigator } = createVirentiaBottomTabsNavigator({
  router,
  routes: [
    { route: homeRoute, view: HomeScreen },
    {
      route: profileRoute,
      view: ProfileScreen,
      openPayload: {
        params: { id: "42" },
        query: { source: "tab" },
      },
    },
    {
      route: detailsRoute,
      view: DetailsScreen,
      openPayload: () => ({ id: currentUserId() }),
    },
  ],
  initialRouteName: "home",
});

openPayload — единственное дополнение к обычному представлению роута; все остальное совпадает с createRouteView.

ts
interface VirentiaBottomTabsRouteView extends RouteView {
  openPayload?: unknown | (() => unknown);
}

Конфигурация

ts
interface VirentiaBottomTabsNavigatorConfig {
  router: Router;
  routes: VirentiaBottomTabsRouteView[];
  initialRouteName?: string;
  screenOptions?: BottomTabNavigationOptions;
}
ОпцияТипОписание
routerRouterРоутер, которому принадлежат эти вкладки
routesVirentiaBottomTabsRouteView[]Представления роутов, опционально с openPayload
initialRouteNamestringНеобязательное имя первой вкладки (см. Имена экранов)
screenOptionsBottomTabNavigationOptionsНеобязательные опции, применяемые к каждой вкладке

Следование за внешними открытиями

Навигатор также следует за открытиями роутов, которые приходят извне панели вкладок — deep link, обработчик push-уведомления или вызов route.open в бизнес-логике. Когда такой роут открывается, его вкладка становится активной, а экран читает свежие параметры из модели роута, поэтому внешний profileRoute.open({ params: { id: "99" } }) выбирает вкладку профиля и показывает id 99.