useSyntheticBlurEvent — это хук из библиотеки
React Aria, предназначенный для управления
blur-событиями на компонентах пользовательского
интерфейса. В отличие от стандартного обработчика onBlur в
React, этот хук обеспечивает кросс-браузерную
совместимость, корректное отслеживание фокусировки внутри
сложных компонентов и удобное создание синтетических событий blur.
Контроль потери фокуса внутри сложных
компонентов В компонентах с вложенными элементами (например,
комбинированные инпуты или выпадающие списки) стандартный
onBlur срабатывает для каждого дочернего элемента.
useSyntheticBlurEvent позволяет отслеживать событие потери
фокуса только тогда, когда фокус действительно уходит из всего
компонента, а не из отдельного вложенного элемента.
Синтетическое событие blur Хук генерирует
синтетическое событие, которое расширяет стандартное
FocusEvent и предоставляет следующие возможности:
relatedTarget — элемент, на который перешёл фокус.target — элемент, который теряет фокус.Интеграция с другими хуками React Aria
useSyntheticBlurEvent хорошо сочетается с хуками
useFocusRing, useFocusWithin, и другими,
обеспечивая комплексное управление фокусом и доступностью.
import { useSyntheticBlurEvent } from '@react-aria/interactions';
const ref = useRef(null);
const { onBlur } = useSyntheticBlurEvent({
onBlur: (e) => {
console.log('Событие blur сработало', e);
},
onFocusChange: (isFocused) => {
console.log('Состояние фокуса', isFocused);
}
});
return Контент;
Параметры хука:
onBlur: (event) => void — функция-обработчик,
вызываемая при синтетическом blur.onFocusChange: (isFocused: boolean) => void —
отслеживает состояние фокуса компонента целиком. Возвращает
true, если компонент или его потомки в фокусе, и
false, если фокус покинул компонент.Возвращаемые значения:
onBlur — пропсы, которые нужно передать оборачиваемому
элементу для корректной работы синтетического blur.При использовании стандартного onBlur каждый дочерний
элемент вызывает событие при потере фокуса, что приводит к
нежелательному поведению:
console.log('blur')} />
useSyntheticBlurEvent устраняет этот эффект, проверяя
фокус внутри компонента и его потомков. Это особенно
важно для:
import { useSyntheticBlurEvent } from '@react-aria/interactions';
import { useRef, useState } from 'react';
function CustomInput() {
const ref = useRef(null);
const [focused, setFocused] = useState(false);
const { onBlur } = useSyntheticBlurEvent({
onBlur: (e) => {
console.log('Потеря фокуса всего компонента', e.target);
},
onFocusChange: (isFocused) => {
setFocused(isFocused);
}
});
return (
);
}
В этом примере:
focused обновляется только при полном входе
или выходе фокуса из компонента.Использовать вместе с useRef Хук
требует ссылку на DOM-элемент, чтобы отслеживать фокус внутри
компонента.
Совместимость с React 18+ Реализация
синтетических событий построена на современном API React и
PointerEvent, что обеспечивает корректную работу во всех
поддерживаемых браузерах.
Поддержка TypeScript
useSyntheticBlurEvent имеет встроенные типы, позволяющие
точно указывать тип события и состояния фокуса, минимизируя ошибки при
разработке.
Не заменяет onFocus полностью Для
отслеживания отдельных внутренних элементов или логики по наведению
лучше использовать onFocus или
useFocusRing.
useSyntheticBlurEvent идеален для сложных компонентов с
несколькими интерактивными элементами.onBlur на дочерних элементах.