useLink — это хук из библиотеки React
Aria, предназначенный для обеспечения доступности интерактивных
элементов, выполняющих роль ссылок. Он помогает правильно обрабатывать
клавиатурные и мышиные события, поддерживать фокус и соответствовать
стандартам ARIA без необходимости вручную прописывать атрибуты
role, tabIndex или обработчики событий.
import { useLink } from '@react-aria/link';
import { useRef } from 'react';
function MyLink(props) {
let ref = useRef();
let { linkProps } = useLink(props, ref);
return {props.children};
}
href, isDisabled и onPress. или на кастомный компонент.href Строка с адресом ссылки. Используется для
навигации. Если href не указан, useLink
автоматически обрабатывает элемент как интерактивный без перехода по
URL.
isDisabled Булевое значение. Если
true, ссылка становится недоступной для взаимодействия, а
атрибуты aria-disabled и обработка событий корректно
блокируются.
onPress Функция обратного вызова, вызываемая при активации ссылки через клик мыши, Enter или пробел. Позволяет реализовать кастомное поведение вместо стандартной навигации.
elementType Позволяет указать тип рендеримого
элемента, если необходимо использовать не Пример кастомного компонента: Даже если Для SPA (Single Page Application) часто используют роутеры, такие как
React Router. В таких случаях Это сохраняет доступность и корректную работу клавиатурного
управления без лишних костылей., а,
например, с
поведением ссылки.
Обработка событий и фокуса
useLink автоматически управляет:
tabIndex и правильная обработка событий фокуса.role="link"
и aria-disabled, если ссылка недоступна.function CustomLink({ href, children }) {
let ref = useRef();
let { linkProps } = useLink({ href }, ref);
return (
useLink добавляет все необходимые атрибуты для корректной
доступности.
Особенности использования
с роутингом
onPress
позволяет перехватывать стандартное поведение и вызывать навигацию через
роутер:import { useNavigate } from 'react-router-dom';
function RouterLink({ to, children }) {
let navigate = useNavigate();
let ref = useRef();
let { linkProps } = useLink({
onPress: () => navigate(to)
}, ref);
return {children};
}
Советы по доступности
isDisabled вместо ручного управления
pointer-events или opacity.role и tabIndex на
уровне DOM, если применён useLink — это может нарушить
стандарт ARIA.ref, иначе
фокус и клавиатурная навигация будут работать некорректно.useFocusRing для визуального выделения
фокуса, улучшая восприятие пользователями с ограниченными
возможностями.
Взаимодействие с
другими хуками React Aria
useLink.
Примеры продвинутого
применения
function IconLink({ href, icon, children }) {
let ref = useRef();
let { linkProps } = useLink({ href }, ref);
return (
{icon}
{children}
);
}
function ConditionalLink({ href, isAvailable, children }) {
let ref = useRef();
let { linkProps } = useLink({ href, isDisabled: !isAvailable }, ref);
return {children};
}
Ключевые моменты