Допустим, у меня есть отзывчивый компонент ReactJS (Outer
), который что-то делает, когда я нажимаю на него. Внутри более крупного компонента мне нужна единственная кнопка, которая делает что-то особенное, когда я дважды щелкаю ее.
export default function FancyDoubleClickHandler() {
function handleOuterClick() {
console.log("outer single click")
}
function handleInnerClick() {
???
}
return (
<div id="outer" onClick={handleOuterClick}>
<p>Click on me to do outer click</p>
<button id="inner" onDoubleClick={handleInnerClick}>
<p>
Click on me to do outer click -- OR --
Double-click on me to do special inner click thing only
</p>
</button>
</div>
)
}
Как написано, событие onDoubleClick
не препятствует запуску внешнего события onClick
(дважды). Эта основная проблема решена в этом вопросе SO, избегая onDoubleClick
и вместо этого используется унифицированный обработчик кликов, который запускает одиночные клики только после истечения времени ожидания:
function handleAllClicks(event) {
clearTimeout(timer);
if (event.detail === 1) {
timer = setTimeout(() => {
console.log("SINGLE CLICK");
}, SOME_DOUBLECLICK_DELAY)
} else if (event.detail === 2) {
console.log("DOUBLE CLICK");
}
}
Но в этом ответе нет необходимости останавливать распространение событий, поэтому двойной щелчок по внутренней кнопке по-прежнему распространяет два события щелчка на handleOuterClick
. В моем случае мне нужно подавить эти внешние события в случае двойного щелчка.
В (современном) ReactJS, как я могу создать архитектуру, в которой внутренний элемент перехватывает и обрабатывает двойной щелчок, но распространяет один щелчок вверх?