ActionSheet

Компонент для отображения списка действий в виде всплывающего меню. Поддерживает различные режимы отображения в зависимости от платформы и размера экрана. Например, на платформе iOS компонент имитирует поведение нативного ↗. В качестве элементов списка принимает коллекцию ActionSheetItem.

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

При использовании данного компонента отталкивайтесь от контекста и количества действий. Использование ActionSheet хорошо подходит для отображения вариантов в ответ на осознанное действие. Например, при отмене редактирования электронного письма среди доступных вариантов могут быть такие действия как “Удалить изменения”, “Сохранить черновик” и “Вернуть к редактированию”.

Свойство onClose принимает функцию, которая вызовется после завершения анимации закрытия компонента. Обязательно удаляйте из DOM-дерева компонент ActionSheet в обработчике onClose, иначе в верстке останется прозрачный элемент, который будет мешать дальнейшему взаимодействию с элементами и повторному открытию компонента.

Функция принимает объект с информацией о причине закрытия:

function handleClose({ closedBy }) {
  if (closedBy === 'action-item') {
    // закрытие произошло по выбору действия из списка
  } else if (closedBy === 'cancel-item') {
    // закрытие произошло по нажатию на кнопку отмены
  } else if (closedBy === 'cancel-item') {
    // закрытие произошло по другим причинам (например, клик вне области всплывающего окна)
  }
}

В данное свойство следует передавать элемент, относительно которого будет позиционироваться компонент в mode="menu" (учитывая автоматическое определение режима). В качестве значения лучше передавать ref-объект ↗.

Задаётся свойством mode. По умолчанию отображение определяется в зависимости от размеров экрана.

  • "sheet" — отображение снизу экрана в виде всплывающего окна (по умолчанию для мобильных устройств)
  • "menu" — отображение в виде всплывающего элемента относительно якорного элемента (по умолчанию для десктопа)

В компоненте есть возможность задать заголовок и описание для списка с помощью свойств title и description соответственно.

<ActionSheet title="Выберите действие" description="Это описание для списка действий">
  <ActionSheetItem>Действие 1</ActionSheetItem>
  <ActionSheetItem>Действие 2</ActionSheetItem>
  <ActionSheetItem>Действие 3</ActionSheetItem>
</ActionSheet>

Свойство placement отвечает за направление положения относительно якорного элемента. Оно поддерживается только для mode="menu" (учитывая автоматическое определение режима).

Обратите внимание, что компонент выбирает наилучшее расположение самостоятельно, а данное свойство задаёт только приоритетное положение. Это означает, что в случае недостаточного места для позиционирования по приоритетному положению, будет выбрано любое другое подходящее.

В качестве вариантов положения ориентируйтесь на значения из библиотеки floating-ui ↗.

Свойство popupOffsetDistance позволяет задать отступ (в пикселях) от якорного элемента.

По умолчанию событие click не всплывает, что позволяет изолировать компонент от остального приложения. Если вам необходимо данное событие обрабатывать (например, у вас есть глобальный обработчик клика для сбора аналитики), воспользуйтесь свойством allowClickPropagation.

Данное свойство позволяет автоматически устанавливать фокус на первом интерактивном элементе при открытии всплывающего элемента. По умолчанию это поведение включено, но можно его отключить, передав autoFocus={false}.

Также есть возможность установить фокус на контейнере всплывающего меню, передав autoFocus="root". Это может быть полезно, когда первый интерактивный элемент имеет подсказку, которая активируется при фокусе. В таком случае появление подсказки сразу после открытия всплывающего меню может быть нежелательным. Значение "root" позволяет поддержать данный сценарий, не ломая доступность.

Данное свойство позволяет восстанавливать фокус после закрытия всплывающего меню на последний активный элемент. По умолчанию данное поведение включено, но можно его отключить, передав restoreFocus={false}.

Также есть возможность передать в restoreFocus функцию, которая возвращает HTMLElement или boolean. Если возвращается HTMLElement, то фокус будет возвращен на этот элемент, при false — фокус не восстанавливается, при true — поведение по умолчанию.

Свойство позволяет задать задержку (в миллисекундах) при установке и восстановлении фокуса.

Согласно рекомендациям Apple в ActionSheet должен быть вариант действия “Отмена”, который бы позволял закрывать всплывающее окно без выполнения дополнительных действий.

Используя свойство iosCloseItem, можно передать свой вариант элемента “Отмена”, по умолчанию используется компонент ActionSheetDefaultIosCloseItem.

import { ActionSheet, ActionSheetDefaultIosCloseItem } from '@vkontakte/vkui';
 
<ActionSheet
  iosCloseItem={<ActionSheetDefaultIosCloseItem>{cancelLabel}</ActionSheetDefaultIosCloseItem>}
>
  {/* ActionSheetItem */}
  {/* ActionSheetItem */}
  {/* ActionSheetItem */}
</ActionSheet>;

Подкомпонент для отображения элемента всплывающего меню. Каждому компоненту можно задать различные режимы отображения, добавлять иконки и метаданные.

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

Задаётся свойством mode.

Стандартный цвет отображения текста, используется в действиях, где нет необходимости в привлечении дополнительного внимания.

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

Цвет критических действий (чаще всего красный), старайтесь располагать такие действия сверху списка, где они наиболее заметны.

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

Цвет действия отмены.

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

Свойство isCancelItem позволяет пометить пункт действия как “Отмена”.

Согласно рекомендациям Apple в ActionSheet должен быть вариант действия “Отмена”, который бы позволял закрывать всплывающее окно без выполнения дополнительных действий.

Подробнее с использованием можно ознакомиться на странице ActionSheet.

Основной контент компонента (заголовок) можно задать, передав в свойство children необходимый текст:

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

Свойство subtitle позволяет отобразить дополнительный текст под заголовком:

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

Свойство meta даёт возможность отобразить небольшой пояснительный текст или индикатор рядом с заголовком:

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

По умолчанию большое количество текста обрезается и заменяется на многоточие, поддерживая однострочный режим отображения. Это поведение можно отключить (для всех текстовых элементов) с помощью свойства multiline:

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

В компоненте доступна возможность добавления дополнительного контента слева и/или справа от текста, задаётся свойством before и after соответственно. Наиболее частый вариант использования свойств before/after - иконки или аватары.

В соответствии с рекомендациями дизайн-системы, для десктопного представления (compact-режим) следует использовать иконки размером 20px, для мобильного представления (regular-режим) — 28px. Проще всего это сделать, используя компонент AdaptiveIconRenderer.

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

Свойство позволяет отключить возможность взаимодействия с пунктом меню.

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

Свойство даёт возможность выбирать элемент (визуальная и нативная имитация элемента радиокнопки). При использовании данного свойства вы также можете передавать стандартные свойства радиокнопок, для управления поведением:

  • name — имя группы для радиокнопок;
  • value — значение радиокнопки;
  • defaultChecked — установить выбранным по умолчанию;
  • checked и onChange — для контролируемого извне использования выбранного значения;
Загружается...

Дополнительно через свойство iconChecked есть возможность изменить иконки радиокнопки, которая рисуется по умолчанию.

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

Нажатие на пункт меню можно обработать с помощью свойств onClick и onImmediateClick.

По умолчанию onClick будет вызван после завершения анимации скрытия всплывающего меню и после вызова onClose. Из этого следует, что в объекте события значение поля currentTarget будет не определено. Если вам нужен объект события именно на момент нажатия, воспользуйтесь onImmediateClick.

Если задано свойство selectable={true}, то выбор пункта следует обрабатывать с помощью свойства onChange. Пример можно увидеть выше.

Если указать свойство href, компонент будет рендериться как ссылка <a>. Также можно задать стандартное свойство target:

<ActionSheetItem href="https://vk.com" target="_blank">
  Перейти на vk.com
</ActionSheetItem>
  • у ActionSheet уже заданы атрибуты role="dialog" и aria-modal="true", потому что по умолчанию он появляется как диалог и, пока он не закроется, нельзя взаимодействовать с другими элементами на странице. Эти атрибуты можно переопределить, явно передавая их компоненту;
  • у целевого элемента обязательно должен быть выставлен атрибут aria-expanded.
  • при задании параметра selectable={true} для корректной работы важно задать всем ActionSheetItem одинаковое значение параметра name. Обусловлено это тем, что в реализации используется нативный input[type='radio'] и по пунктам можно навигировать как по обычным radio-кнопкам;
  • при задании selectable={true} в реализации используется тег "label". В остальных случаях используется тег "div".
СвойствоОписание
allowClickPropagationboolean

По умолчанию событие onClick не всплывает.

По умолчанию: -
autoFocusboolean | "root"
По умолчанию: true
descriptionReactNode

Описание всплыващего окна, под заголовком.

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

Deprecated: Since 7.3.0.

Свойство не используется и будет удалено в v8.

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

Только мобильный iOS.

По умолчанию: -
mode"menu" | "sheet"

Режим отображения компонента:

  • sheet – отображение снизу экрана в виде всплывающего окна, подходит для мобильных устройств
  • menu – отображение в виде всплывающего элемента, относительно якорного элемента.
По умолчанию: -
mountboolean

Deprecated: Since 7.3.0.

Свойство не используется и будет удалено в v8.

По умолчанию: -
onClose(options: ActionSheetOnCloseOptions) => void

Закрыть всплыващее окно по нажатию снаружи.

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

Позиционирование всплывающего окна для десктопа. Компонент выберет наилучшее расположение сам, но можно задать приоритетное направление с помощью этого свойства.

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

Отступ, где заданное кол-во единиц равняется пикселям.

По умолчанию: -
restoreFocusboolean | (() => boolean | HTMLElement)
По умолчанию: true
timeoutnumber
По умолчанию: 0
titleReactNode

Заголовок всплыващего окна.

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

Элемент, рядом с которым вылезает всплывающий элемент на десктопе. Лучше передавать RefObject c current.

По умолчанию: -
СвойствоОписание
afterReactNode

Иконка или другой React-элемент для отображения после основного контента.

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

По умолчанию нажатие на опцию вызывает переданную в ActionSheet функцию onClose, данное свойство позволяет отключить такое поведение.

По умолчанию: false
beforeReactNode

Иконка или другой React-элемент для отображения перед основным контентом.

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

Блокировка взаимодействия с компонентом.

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

Если указано, элемент будет использоваться как ссылка.

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

Иконка для selectable режима.

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

Позволяет отделить ActionItem от CancelItem для определении того, кто вызвал закрытие ActionSheet. Используется в ActionSheet.onClose().

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

Дополнительная информация, отображаемая рядом с основным контентом.

По умолчанию: -
mode"default" | "destructive" | "cancel"

Свойство, определяющее внешний вид элемента действия.

По умолчанию: default
multilineboolean

Все текстовые элементы при необходимости занимают несколько строк.

По умолчанию: false
onClickMouseEventHandler<HTMLElement>

По умолчанию onClick будет вызван после завершения анимации скрытия и после вызова onClose. Из этого следует, что в объекте события значения полей типа currentTarget будут не определены. Если вам нужен объект события именно на момент нажатия, используйте onImmediateClick.

По умолчанию: -
onImmediateClickMouseEventHandler<HTMLElement>

Обработчик нажатия, вызывающийся непосредственно в момент нажатия (в отличие от onClick).

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

Включает возможность выбрать элемент (отображает радиокнопку).

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

Слот для подсказки или вспомогательного текста.

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

Атрибут target для тега <a>.

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