В интерфейсах часто требуется контролировать время появления и скрытия элементов, таких как всплывающие подсказки, модальные окна или меню. В библиотеке React Aria для этого используются концепции showDelay и hideDelay, которые позволяют управлять видимостью компонентов с учётом времени. Эти параметры помогают создавать более естественные и удобные взаимодействия, предотвращая «мигание» элементов при быстрых действиях пользователя.
showDelay определяет задержку перед тем, как элемент становится видимым после триггера (например, наведение мыши или фокус). hideDelay задаёт задержку перед скрытием элемента после того, как триггер перестаёт быть активным.
useTooltipTrigger и задержкиReact Aria предоставляет хук useTooltipTrigger, который упрощает управление всплывающими подсказками и включает поддержку задержек.
import { useTooltipTriggerState } from '@react-stately/tooltip';
import { useTooltipTrigger } from '@react-aria/tooltip';
import { useRef } from 'react';
function TooltipExample() {
const triggerRef = useRef();
const state = useTooltipTriggerState({ delay: 500 }); // общая задержка
const { triggerProps, tooltipProps } = useTooltipTrigger({ delay: { show: 300, hide: 200 } }, state, triggerRef);
return (
<>
<button {...triggerProps} ref={triggerRef}>Наведи на меня</button>
{state.isOpen && <div {...tooltipProps}>Подсказка с задержкой</div>}
</>
);
}
Ключевые моменты:
delay в useTooltipTrigger может быть
объектом { show, hide }, что позволяет отдельно настраивать
время появления и скрытия.triggerRef необходим для корректного позиционирования
всплывающей подсказки.mouseenter,
mouseleave, focus и blur,
обеспечивая единый механизм для показа и скрытия.Для меню и других всплывающих панелей используется useOverlayTriggerState совместно с useOverlayTrigger:
import { useOverlayTriggerState } from '@react-stately/overlays';
import { useOverlayTrigger } from '@react-aria/overlays';
function MenuExample() {
const triggerRef = useRef();
const state = useOverlayTriggerState({ delay: { show: 250, hide: 150 } });
const { triggerProps, overlayProps } = useOverlayTrigger({ type: 'menu' }, state, triggerRef);
return (
<>
<button {...triggerProps} ref={triggerRef}>Открыть меню</button>
{state.isOpen && (
<div {...overlayProps} style={{ background: 'white', border: '1px solid gray' }}>
<div>Пункт 1</div>
<div>Пункт 2</div>
</div>
)}
</>
);
}
Особенности:
show и hide позволяют
настраивать пользовательский опыт, например, ускоряя скрытие, но
замедляя показ.useOverlayPosition обеспечивает корректное
позиционирование вне зависимости от задержек.Можно применять задержки не только к стандартным всплывающим
элементам, но и к кастомным компонентам, используя
setTimeout совместно с состоянием React для управления
показом и скрытием:
const [isVisible, setIsVisible] = useState(false);
let showTimer, hideTimer;
function handleMouseEnter() {
clearTimeout(hideTimer);
showTimer = setTimeout(() => setIsVisible(true), 300);
}
function handleMouseLeave() {
clearTimeout(showTimer);
hideTimer = setTimeout(() => setIsVisible(false), 200);
}
return (
<div onMouseEn ter={handleMouseEnter} onMouseLe ave={handleMouseLeave}>
Триггер
{isVisible && <div>Элемент с кастомной задержкой</div>}
</div>
);
Такой подход позволяет создавать сложные сценарии, когда стандартные хуки React Aria недостаточны, например, когда требуется динамическое изменение времени задержки.
Задержки показа и скрытия являются фундаментальным инструментом в построении интерактивных и отзывчивых пользовательских интерфейсов на базе React Aria.