useHover — это хук из библиотеки React Aria,
предназначенный для управления состоянием наведения (hover) на элементах
интерфейса с учётом доступности. Он автоматически обеспечивает
корректное поведение как для мыши, так и для сенсорных устройств,
избегая ложных срабатываний и поддерживая взаимодействие с клавиатурой и
вспомогательными технологиями.
Для начала работы useHover импортируется напрямую из
пакета:
import { useHover } from '@react-aria/interactions';
Простейший пример использования:
import { useHover } from '@react-aria/interactions';
import { useRef } from 'react';
function HoverButton() {
const ref = useRef();
const { hoverProps, isHovered } = useHover({});
return (
<button
{...hoverProps}
ref={ref}
style={{
backgroundColor: isHovered ? 'lightblue' : 'white',
transition: 'background-color 0.2s ease'
}}
>
Наведи на меня
</button>
);
}
Ключевые моменты:
hoverProps — набор пропсов, которые нужно передать
элементу, чтобы useHover корректно отслеживал события
наведения.isHovered — булевое значение, указывающее, находится ли
курсор мыши над элементом.isDisableduseHover поддерживает опцию isDisabled,
которая отключает отслеживание наведения:
const { hoverProps, isHovered } = useHover({ isDisabled: true });
В этом случае hoverProps не будут реагировать на события
мыши и сенсора. Это полезно для условного взаимодействия, например,
когда элемент временно неактивен.
На сенсорных устройствах хук корректно определяет касания,
предотвращая ложные состояния наведения, которые часто возникают при
имитации мыши на мобильных устройствах. React Aria автоматически
отключает hover для элементов, где взаимодействие через
сенсор подразумевает клик или свайп, что повышает точность
интерфейса.
useHover можно безопасно комбинировать с другими хуками
из @react-aria/interactions, такими как
usePress или useFocusRing. Например, для
кнопки с наведением и фокусом:
import { useHover, useFocusRing, usePress } from '@react-aria/interactions';
import { useRef } from 'react';
function InteractiveButton() {
const ref = useRef();
const { hoverProps, isHovered } = useHover({});
const { focusProps, isFocusVisible } = useFocusRing();
const { pressProps, isPressed } = usePress({});
return (
<button
{...hoverProps}
{...focusProps}
{...pressProps}
ref={ref}
style={{
backgroundColor: isPressed
? 'darkblue'
: isHovered
? 'lightblue'
: 'white',
outline: isFocusVisible ? '2px solid orange' : 'none',
transition: 'all 0.2s ease'
}}
>
Интерактивная кнопка
</button>
);
}
Особенности:
useFocusRing обеспечивает видимую подсветку при фокусе
клавиатурой.usePress добавляет состояние нажатия.onHoverStart и
onHoverEndХук поддерживает обработчики начала и окончания наведения:
const { hoverProps } = useHover({
onHoverStart: () => console.log('Наведение началось'),
onHoverEnd: () => console.log('Наведение завершилось')
});
Эти callbacks позволяют запускать анимации, логировать события или
динамически изменять состояние приложения при наведении. Использование
их предпочтительно перед прямым наблюдением isHovered в
useEffect, так как они учитывают внутренние механизмы React
Aria и оптимизированы под разные платформы.
useHover идеально подходит для создания кастомных
компонентов, например, тултипов или всплывающих меню:
function Tooltip({ children, label }) {
const ref = useRef();
const { hoverProps, isHovered } = useHover({});
return (
<div style={{ display: 'inline-block', position: 'relative' }} {...hoverProps} ref={ref}>
{children}
{isHovered && (
<div style={{
position: 'absolute',
bottom: '100%',
left: '50%',
transform: 'translateX(-50%)',
padding: '4px 8px',
backgroundColor: 'black',
color: 'white',
borderRadius: '4px',
whiteSpace: 'nowrap'
}}>
{label}
</div>
)}
</div>
);
}
Преимущества подхода:
isHovered.ref к элементу, так как React
Aria отслеживает события через реальный DOM-узел.usePress,
useFocusRing) для комплексных UI-компонентов.onHoverStart и
onHoverEnd для оптимизированного реагирования на наведение,
особенно при сложных анимациях или сетевых запросах.useHover обеспечивает универсальный, доступный и
кросс-платформенный способ управления наведением в React-приложениях,
позволяя создавать интерфейсы, корректно работающие на мыши, клавиатуре
и сенсорных устройствах.