useLabel — это хук из библиотеки React Aria,
предназначенный для обеспечения доступности компонентов путем
корректного связывания элементов формы с их метками. Он является частью
набора инструментов для создания компонентов, соответствующих стандартам
WAI-ARIA.
useLabelГлавная задача хука — предоставить свойства (props),
которые можно безопасно применить к:
input,
textarea или кастомному компоненту поля формы)label)Это позволяет:
htmlFor и id.useTextField, useCheckbox,
useSwitch.const { labelProps, fieldProps } = useLabel(props);
props — объект с параметрами, где ключевым является
label (строка с текстом метки).labelProps — свойства, которые применяются к компоненту
метки. Обычно содержат атрибут htmlFor.fieldProps — свойства, которые применяются к полю
ввода, включая id, необходимый для связи с меткой.Пример базового использования:
import { useLabel } from "@react-aria/label";
function TextInput({ label }) {
const { labelProps, fieldProps } = useLabel({ label });
return (
<div>
<label {...labelProps}>{label}</label>
<input {...fieldProps} />
</div>
);
}
В этом примере React Aria автоматически создаёт уникальный
id для поля ввода и связывает его с меткой через
htmlFor. Если передан собственный id, хук
использует его вместо генерации.
useLabel поддерживает передачу других атрибутов, таких
как required, aria-label,
aria-labelledby. Они передаются через объект
props:
const { labelProps, fieldProps } = useLabel({
label: "Email",
required: true
});
required: true автоматически добавляет атрибут
aria-required к полю.aria-label:useLabel({ "aria-label": "Search input" });
useLabel часто комбинируется с:
useTextField — для текстовых
полейuseCheckbox — для чекбоксовuseSwitch — для переключателейПример интеграции с useTextField:
import { useTextField } from "@react-aria/textfield";
import { useLabel } from "@react-aria/label";
function EmailInput({ label }) {
const { labelProps, fieldProps } = useLabel({ label });
const { inputProps } = useTextField(fieldProps);
return (
<div>
<label {...labelProps}>{label}</label>
<input {...inputProps} />
</div>
);
}
Здесь fieldProps передаются в useTextField,
чтобы сохранить корректную работу всех ARIA-атрибутов и обработчиков
событий.
При создании компонентов, которые визуально не используют стандартные
HTML-поля (input, textarea), важно:
fieldProps к корневому элементу
компонента.id и aria-labelledby.aria-describedby.Пример кастомного поля:
function CustomInput({ label }) {
const { labelProps, fieldProps } = useLabel({ label });
return (
<div>
<span {...labelProps}>{label}</span>
<div role="textbox" {...fieldProps} tabIndex={0}></div>
</div>
);
}
useLabel не создает визуальные
элементы — метка должна быть отрисована отдельно.aria-labelledby для привязки.label без
необходимости перерендеривания всего компонента.useLabel обеспечивает доступность через корректную
связь метки и поля.id и связывает его с
htmlFor.useLabel является фундаментальным инструментом для любых
компонентов формы в React Aria, гарантируя, что взаимодействие с
элементами будет доступно для всех пользователей.