Хук useFocus предназначен для управления фокусом на
элементах интерфейса в приложениях на React с
соблюдением доступности (a11y). Он позволяет отслеживать состояние
фокуса, а также правильно реагировать на события focus и
blur без необходимости вручную подписываться на
DOM-события.
import {useFocus} from '@react-aria/interactions';
function FocusableButton() {
let {focusProps, isFocused} = useFocus({});
return (
<button {...focusProps}>
{isFocused ? 'В фокусе' : 'Не в фокусе'}
</button>
);
}
focusProps — объект с обработчиками событий
(onFocus, onBlur), который необходимо
применить к элементу.isFocused — булево значение, показывающее текущее
состояние фокуса элемента.Хук позволяет не только отслеживать фокус, но и добавлять кастомные обработчики событий:
let {focusProps, isFocused} = useFocus({
onFocusChange: (focused) => {
console.log('Состояние фокуса:', focused);
}
});
onFocusChange вызывается при каждом изменении состояния
фокуса.useFocus корректно работает с клавиатурными
навигациями, такими как Tab и
Shift+Tab, обеспечивая:
function InputField() {
let {focusProps, isFocused} = useFocus({});
return (
<input
{...focusProps}
style={{borderColor: isFocused ? 'blue' : 'gray'}}
/>
);
}
isFocused позволяет визуально выделять активный
элемент.Для сложных компонентов, например, комбинированных кнопок или полей
ввода с иконками, useFocus помогает отслеживать фокус на
корневом элементе, не требуя отдельных обработчиков для
каждого вложенного элемента:
function CompositeButton() {
let {focusProps, isFocused} = useFocus({});
return (
<div {...focusProps} tabIndex={0} style={{outline: isFocused ? '2px solid red' : 'none'}}>
<span>Иконка</span>
<span>Текст кнопки</span>
</div>
);
}
tabIndex={0} делает контейнер фокусируемым.isFocused.useFocus часто используется совместно с хуками вроде
useHover или usePress для создания
интерактивных компонентов с полным набором событий:
import {useHover} from '@react-aria/interactions';
function InteractiveCard() {
let {focusProps, isFocused} = useFocus({});
let {hoverProps, isHovered} = useHover({});
return (
<div
{...focusProps}
{...hoverProps}
style={{
border: isFocused ? '2px solid blue' : isHovered ? '2px solid gray' : '1px solid black'
}}
tabIndex={0}
>
Карточка
</div>
);
}
focusProps на элемент, который
должен быть фокусируемым.onFocus и onBlur напрямую,
если уже применен focusProps, чтобы избежать
конфликтов.isFocused, а не
:focus CSS, что повышает контроль над состоянием через
JavaScript.tabIndex=0 и
использовать один useFocus, чтобы управлять фокусом
централизованно.focus/bluruseFocus обеспечивает согласованное поведение
на всех браузерах и устройствах, включая мобильные.useFocus
можно комбинировать с useModal для отслеживания активного
элемента при открытом модальном диалоге.useListBox или useGrid позволяет управлять
фокусом по элементам без дублирования логики.Tab, Shift+Tab,
ArrowKeys, обеспечивая соответствие стандартам ARIA.useFocus в React Aria предоставляет гибкий и
безопасный инструмент для управления фокусом, упрощает
реализацию доступных интерфейсов и позволяет создавать сложные
интерактивные компоненты с минимальными усилиями.