【发布时间】:2019-11-06 08:04:08
【问题描述】:
我有一个模式对话框,如果用户在模式之外单击,我想关闭它。我编写了以下 useEffect 代码,但遇到了以下问题:
模态对话框包含许多子节点(React 节点),这些子节点可能会发生变化(例如,用户删除列表的条目)。这些交互触发了我的 onClick 方法,但是由于单击的列表项已从模态中删除,因此即使单击在模态中,模态也会关闭。
我认为在 useEffect 的第二个参数中添加 [children] 会足够快地清理旧的效果事件侦听器,以使该方法不会再次运行,但事实并非如此。
我在具有ignoreNextClick-state 的类组件中处理了同样的问题,但必须有更简洁的解决方案,对吧?
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 ] );
【问题讨论】:
标签: javascript reactjs react-hooks use-effect