Событие клика вне компонента
Отлавливает щелчок за пределами компонента Слушает только щелчки внутри браузерного документа
- 📦 1 кБ в сжатом виде.
- ⚛️ Поддерживает порталы
Пример
Например, если вам нужно скрыть выпадающее меню щелчком по странице за его пределами:
<ClickAwayListener onClickAway={handleClickAway}>
<div className={classes.root}>
<button type="button" onClick={handleClick}>
Open menu dropdown
</button>
{open ? (
<div className={classes.dropdown}>
Click me, I will stay visible until you click outside.
</div>
) : null}
</div>
</ClickAwayListener>
Обратите внимание, что компонент принимает только один дочерний элемент. Более подробный пример вы можете найти в разделе документации меню.
Portal
Следующее демо использует Портал
для рендеринга раскрывающегося меню в новое поддерево вне текущей иерархии DOM.
<ClickAwayListener onClickAway={handleClickAway}>
<div>
<button type="button" onClick={handleClick}>
Open menu dropdown
</button>
{open ? (
<Portal>
<div className={classes.dropdown}>
Click me, I will stay visible until you click outside.
</div>
</Portal>
) : null}
</div>
</ClickAwayListener>
Ведущие события
По умолчанию компонент отвечает на конечные события (клик (click) + окончание касания (touchend)). Однако, вы можете настроить его таким образом, чтобы он отвечал и на ведущие событие (нажатие кнопки мыши (mousedown) + начало касания (touch start)).
<ClickAwayListener
mouseEvent="onMouseDown"
touchEvent="onTouchStart"
onClickAway={handleClickAway}
>
<div className={classes.root}>
<button type="button" onClick={handleClick}>
Open menu dropdown
</button>
{open ? (
<div className={classes.dropdown}>
Click me, I will stay visible until you click outside.
</div>
) : null}
</div>
</ClickAwayListener>
⚠️ В этом режиме только взаимодействие на полосе прокрутки документа игнорируется.