FormItem
Компонент для создания элементов форм с поддержкой заголовка, подсказки и статуса валидации.
Позволяет создавать структурированные и доступные формы с единым стилем оформления.
Рекомендуется оборачивать в компонент все поля, кроме Radio
и Checkbox
, если для
них в дизайне не предусмотрены заголовки и иные описательные элементы.
Структура компонента
FormItem
состоит из трёх основных частей:
top
— заголовок элемента формы;children
— основной контент (поле ввода);bottom
— подсказка или сообщение о статусе валидации.
Подкомпоненты
Иногда шапка у поля может быть составной, то есть содержать несколько отдельных компонентов для сегментирования
представленной информации. В таком случае воспользуйтесь подкомпонентами, которые позволят вам собрать необходимый
заголовок самостоятельно и более гибко управлять передаваемыми в компоненты свойствами (например, для a11y
).
<FormItem.Top>
служит оберткой для составной шапки поля, отвечая за выравнивание контента и расстановку отступов;<FormItem.TopLabel>
отвечает за отрисовку заголовка поля. По умолчанию компонент представлен тегомlabel
, если передано свойствоhtmlFor
. Можно переопределить через свойствоComponent
;<FormItem.TopAside>
отвечает за отрисовку дополнительного контента справа от заголовка поля.
Состояния
disabled
Свойство disabled
блокирует взаимодействие с компонентом и добавляет визуальную индикацию недоступности.
Валидация
Задаётся свойством status
.
"default"
- обычное состояние компонента (по умолчанию);"error"
- состояние ошибки, используйте данное значение, чтобы сообщить пользователю о некорректно введённых данных;"valid"
- состояние успешной валидации, используйте для индикации прошедшей проверки или при исправлении ошибки.
Если вы используете значения "error"
(реже "valid"
), старайтесь сопровождать состояние поясняющим сообщением, например,
используя свойство bottom
.
Обязательность поля
Свойство required
позволяет пометить поле как обязательное для заполнения.
<FormItem top="Email" required>
<Input type="email" name="email" required />
</FormItem>
Удаление поля
Добавить возможность удалить поле можно с помощью свойства removable
,
которое добавит кнопку удаления, стилизованную под используемую платформу.
Помимо значений true
/false
, также принимает значение "indent"
, которое добавляет визуальный отступ,
позволяя выравнивать удаляемые поля с полями, которые удалить нельзя.
При removable={true}
доступны следующие свойства:
removePlaceholder
— текст, который будет зачитан скринридером или показан на платформе iOS при взаимодействии с кнопкой удаления (по умолчанию “Удалить”);onRemove
— функция-обработчик, которая будет вызвана при нажатии на кнопку удаления.
Отступы
По умолчанию компонент расставляет внешние отступы, чтобы автоматически выравниваться в соответствии с
требованиями дизайн-системы (при использовании в Group
, например). Отключить эти отступы можно с помощью свойства noPadding
.
Тестирование (e2e)
Для возможности тестирования доступны свойства с постфиксом *TestId
, которые вы можете использовать,
чтобы находить необходимые части компонента:
removeButtonTestId
—id
кнопки удаления приremovable={true}
;toggleButtonTestId
—id
кнопки подтверждения удаления (только для iOS).
Доступность (a11y)
Для корректной работы ассистивных технологий необходимо вручную передавать некоторые параметры:
- при передаче в
FormItem
компонента, отвечающего за пользовательский ввод (например,<input type="text" />
), рекомендуется передавать свойстваtop
иhtmlFor
. В компонент пользовательского ввода должно быть передано свойствоid
, которое соответствует значениюhtmlFor
вFormItem
; - при использовании свойства
bottom
рекомендуется также передавать в компонент пользовательского ввода (например,<input type="text" />
) свойствоaria-describedby
, а в самFormItem
передатьbottomId
, который соответствует значениюaria-describedby
.
Свойства и методы
FormItem
Свойство | Описание |
---|---|
bottom | ReactNode Дополнительный элемент, отображаемый под содержимым. По умолчанию: - |
bottomId | string Передаётся при использовании Должен совпадать с По умолчанию: - |
Component | ElementType<any, keyof IntrinsicElements> По умолчанию: - |
getRootRef | Ref<HTMLElement> По умолчанию: - |
noPadding | boolean Удаляет внешние отступы вокруг компонента. По умолчанию: - |
onRemove | ((e: MouseEvent<Element, MouseEvent>, rootEl?: HTMLElement | null) => void) | undefined Обработчик, срабатывающий при нажатии на контрол удаления. По умолчанию: - |
removable | boolean | "indent" Дает возможность удалить Режим По умолчанию: - |
removeButtonTestId | string Передает атрибут По умолчанию: - |
removePlaceholder | ReactNode Текст кнопки удаления ячейки. Визуально скрыт везде, кроме iOS. На iOS появляется в выезжающей кнопке для удаления ячейки. По умолчанию: Удалить |
required | boolean Помечает поле обязательным. По умолчанию: false |
status | "default" | "error" | "valid" Статус, влияющий на стиль отображения компонента. По умолчанию: default |
toggleButtonTestId | string Передает атрибут По умолчанию: - |
top | ReactNode Дополнительный элемент, отображаемый над содержимым. По умолчанию: - |
topComponent | ElementType<any, keyof IntrinsicElements> Позволяет поменять тег используемый для top Если оставить пустым, то тег top будет span. Если оставить пустым и использовать htmlFor, то тег top будет label. По умолчанию: - |
topId | string Передаётся при использовании
По умолчанию: - |
topMultiline | boolean Многострочный вывод заголовка. По умолчанию текст не переносится при переполнении. По умолчанию: false |
FormItem.Top
Свойство | Описание |
---|---|
Component | ElementType<any, keyof IntrinsicElements> По умолчанию: - |
getRootRef | Ref<HTMLDivElement> По умолчанию: - |
FormItem.TopLabel
Свойство | Описание |
---|---|
Component | ElementType<any, keyof IntrinsicElements> По умолчанию: - |
getRootRef | Ref<HTMLElement> По умолчанию: - |
FormItem.TopAside
Свойство | Описание |
---|---|
Component | ElementType<any, keyof IntrinsicElements> По умолчанию: - |
getRootRef | Ref<HTMLElement> По умолчанию: - |