У меня есть модальное диалоговое окно, которое я хочу закрыть, если пользователь нажимает за пределами модального.Я написал следующий код useEffect, но столкнулся со следующей проблемой:
Модальное диалоговое окно содержит несколько дочерних элементов (узлов реагирования), и эти дочерние элементы могут измениться (например, пользователь удаляет запись в списке).Эти взаимодействия запускают мой метод onClick, но поскольку элемент списка, по которому щелкнули мышью, был удален из модального режима, модальный режим закрывается, даже если щелчок был внутри модального элемента.
Я подумал, что добавление [children] ко второму параметру для useEffect позволит достаточно быстро очистить старый прослушиватель событий эффекта, чтобы метод не запустился снова, но это не так.
Я обработал ту же проблему в компоненте класса с ignoreNextClick
состоянием, но должно быть более чистое решение, верно?
useEffect( () => {
const onClick = ( event ) => {
const menu = document.getElementById( 'singleton-modal' );
if ( !menu ) return;
// do not close menu if user clicked inside
const targetInMenu = menu.contains( event.target );
const targetIsMenu = menu === event.target;
if ( targetInMenu || targetIsMenu ) return;
onCloseModal();
};
window.addEventListener( 'click', onClick, false );
return () => window.removeEventListener( 'click', onClick, false );
}, [ children ] );