Мой вопрос относится к коду React, но возможно, что ответ больше связан с тем, как HTML События функционируют в целом, а не с React.
Я создаю компонент, в котором любой щелчок внутри вложенного элемента <div>
должен вызвать определенный c обработчик щелчка. Это легко реализовать как функцию onClick
, прикрепленную к этому «родительскому div». Компонент также содержит флажок внутри него. Из-за бизнес-правил этого компонента, я не хочу, чтобы родительский div onClick
срабатывал при нажатии этого флажка.
Рассмотрим эту наивную реализацию этого компонента:
function NaiveComponent() {
return (
<div onClick={() => console.log("Clicked parent onClick()")}>
<label><input type="checkbox" /></label>
<div> ... </div>
</div>
)
}
Что мне показалось интересным, так это то, что onClick
запускается дважды при смене флажка, но только один раз в противном случае. Я читал статьи, которые предполагают, что это связано с тем, как щелчки меток распространяются на элемент ввода (как подсказывает Контейнер React div onClick конфликтует с флажком onChange ).
У меня есть также попытался остановить распространение события click, подключив к входу следующий обработчик захвата. Он только остановил один из вызовов родительского onClick
от запуска.
onClickCapture={e => e.stopPropagation()}
Обновление
Я полностью изменил дизайн компонента, чтобы флажок больше не помещался в div с обработчиком кликов. Во-первых, это был плохой дизайн интерфейса. Я думаю, что мои проблемы с обработчиками кликов были вызваны слоями библиотек, которые мое приложение использует для стилей. Для меня должно было быть очевидно, что то, что я делал, было запахом кода, исходя из трудности, с которой я столкнулся.
Спасибо всем, кто дал ответ.