Epic

Компонент, реализующий интерфейс с централизованной навигацией через закреплённую нижнюю панель (Tabbar). Принимает коллекцию Root или View.

Связанные страницы:

Загружается...
  • Вы разрабатываете мобильное приложение (viewWidth <= SMALL_TABLET).
  • По дизайну требуется панель с быстрой навигацией на основные разделы.

Принимает необходимое количество View и/или Root с уникальным id. Далее id с нужным сценарием передаётся в свойство activeStory.

Epic
  └─ View N
    └─ Panel N
      └─ PanelHeader
      └─ <content>
  └─ Root N
    └─ View N
      └─ Panel N
        └─ PanelHeader
        └─ <content>

Подкомпонент прибивает элементы навигации (TabbarItem) к низу экрана. Передаётся в свойство tabbar компонента Epic.

Загружается...

В случае, если в Tabbar передан один или два элемента TabbarItem, контент внутри этих элементов располагается по горизонтали, в остальных случаях контент располагается вертикально.

С помощью свойства mode у Tabbar можно переопределить это поведение.

  • "vertical" — задаёт всегда вертикальное расположение;
  • "horizontal" — задаёт всегда горизонтальное расположение.
Загружается...

Подкомпонент позволяет создать навигационный элемент. Чаще всего представлен иконкой размером 28px. Допускается использовать текст рядом с иконкой. Иконку необходимо передавать в свойство children, текст — в свойство label.

Загружается...

Иконка и текст могут располагаться либо горизонтально, либо вертикально. Управлять этим поведением можно с помощью свойства mode у Tabbar.

Используйте свойство selected, чтобы показать текущий активный раздел.

Загружается...

С помощью свойства indicator можно задать для компонента счётчик или индикатор уведомления. Передавайте компоненты Counter с size="s" или Badge.

Загружается...

Через свойство Component можно переопределить тэг, который будет отрендерен компонентом (по умолчанию при передаче свойства href компонент использует тэг a, в иных случаях button);

Если вы не передаете свойство label, то ассистивные технологии не смогут однозначно озвучить ваш элемент. В таком случае рекомендуется вместе с иконкой передавать в свойство children компонент VisuallyHidden с поясняющим текстом.

import { Icon28UserCircleOutline } from '@vkontakte/icons';
import { TabbarItem, VisuallyHidden } from '@vkontakte/vkui';
 
<TabbarItem>
  {/* Данный текст будет озвучен скринридером */}
  <VisuallyHidden>Профиль</VisuallyHidden>
  <Icon28UserCircleOutline />
</TabbarItem>;

В качестве альтернативного решение можно передать текст для скринридера в свойство aria-label или создать отдельный элемент с текстом и передать его id в свойство aria-labelledby.

<TabbarItem aria-label="Профиль">
  <Icon28UserCircleOutline />
</TabbarItem>
<span id="my-label">Профиль</span>
 
<TabbarItem aria-labelledby="my-label">
  <Icon28UserCircleOutline />
</TabbarItem>

Если у вашего приложения есть настольный режим, то по дизайну скорей всего нужно будет заменять tabbar на другое меню. Чтобы спрятать tabbar на настольном экране – используйте хук useAdaptivityConditionalRender.

export default function App() {
  const { viewWidth } = useAdaptivityConditionalRender();
 
  return (
    <Epic
      activeStory={activeStory}
      tabbar={
        viewWidth.tabletPlus && (
          <Tabbar className={viewWidth.tabletPlus.className}>
            <TabbarItem label="Лента" selected onClick={() => setActiveStory('feed')}>
              <Icon28NewsfeedOutline />
            </TabbarItem>
            <TabbarItem label="Профиль" onClick={() => setActiveStory('profile')}>
              <Icon28UserCircleOutline />
            </TabbarItem>
          </Tabbar>
        )
      }
    >
      <View id="feed" activePanel="feed-panel">
        <Panel id="feed-panel">
          <PanelHeader>Лента</PanelHeader>
          <Placeholder stretched>
            <Icon28NewsfeedOutline />
          </Placeholder>
        </Panel>
      </View>
      <View id="profile" activePanel="profile-panel">
        <Panel id="profile-panel">
          <PanelHeader>Профиль</PanelHeader>
          <Placeholder stretched>
            <Icon28UserCircleOutline />
          </Placeholder>
        </Panel>
      </View>
    </Epic>
  );
}

Примеры замены tabbar на меню приведён на странице Навигация | Пример.

СвойствоОписание
activeStorystring

id активного окна.

По умолчанию: -
childrenReactElement<unknown, string | JSXElementConstructor<any>> | Iterable<ReactElement<unknown, string | JSXElementConstructor<any>>>

Внутри Epic может находиться либо коллекция Root, либо коллекция View. У каждого элемента коллекции должен быть уникальный id.

По умолчанию: -
getRootRefRef<HTMLDivElement>
По умолчанию: -
tabbarReactNode

Компонент Tabbar, который будет отображаться снизу.

По умолчанию: -
СвойствоОписание
getRootRefRef<HTMLDivElement>
По умолчанию: -
mode"auto" | "horizontal" | "vertical"

Задает расположение элементов (вертикальное/горизонтальное).

По умолчанию: -
plainboolean

Флаг, который скрывает тень (Android) или границы (iOS).

По умолчанию: false
СвойствоОписание
ComponentElementType<any, keyof IntrinsicElements>
По умолчанию: href ? 'a' : 'button'
getRootRefRef<HTMLElement>
По умолчанию: -
indicatorReactNode

Индикатор над иконкой. Принимает <Badge mode="prominent" /> или <Counter size="s" mode="prominent" />.

По умолчанию: -
labelReactNode

Текст рядом с иконкой.

По умолчанию: -
selectedboolean

Выбранное состояние компонента.

По умолчанию: -