Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用useeffect react钩子删除组件卸载时的事件侦听器mousedown?_Javascript_Reactjs_Typescript - Fatal编程技术网

Javascript 如何使用useeffect react钩子删除组件卸载时的事件侦听器mousedown?

Javascript 如何使用useeffect react钩子删除组件卸载时的事件侦听器mousedown?,javascript,reactjs,typescript,Javascript,Reactjs,Typescript,我想使用react-usehook删除组件卸载时的eventlistener mousedown 下面是我的代码 function Dialog ({setIsDialogOpen, items}: Props) { const dialogRef = React.useRef<HTMLDivElement>(null); React.useEffect(() => { const handleClickOutsideDialog = (event: any) =&

我想使用react-usehook删除组件卸载时的eventlistener mousedown 下面是我的代码

function Dialog ({setIsDialogOpen, items}: Props) {
const dialogRef = React.useRef<HTMLDivElement>(null);


React.useEffect(() => {
    const handleClickOutsideDialog = (event: any) => {
        if (
            dialogRef &&
                !dialogRef.contains(event.target)//error here
        ) {
            alert('You clicked outside of me!');
            setIsDialogOpen(false);
          }
    };
    document.addEventListener('mousedown', handleClickOutsideDialog);
}, [setIsDialogOpen]);


return (
    <Wrapper ref={dialogRef}>
        <Container_one>
            <span>title</span>
            <Description> some big description</Description>
        </Container_one>
        <Container_two>
            {items.map(item => (
                <div
                    key={item.id}
                />
            ))}
        </Container_two>
    </Wrapper>
);
函数对话框({setIsDialogOpen,items}:Props){
const dialogRef=React.useRef(null);
React.useffect(()=>{
const handleClickOutsideDialog=(事件:any)=>{
如果(
dialogRef&&
!dialogRef.contains(event.target)//此处出错
) {
警惕(“你在我之外点击了!”);
setIsDialogOpen(假);
}
};
document.addEventListener('mousedown',HandleClickOutside对话框);
},[setIsDialogOpen]);
返回(
标题
一些大的描述
{items.map(item=>(
))}
);

这很好。但是我想在使用usehook卸载时删除事件侦听器。我该怎么做。有人可以帮我吗。谢谢。

您可以在清理功能中添加
removeEventListener()

您可以在中找到这些信息

React.useEffect(() => {
    const handleClickOutsideDialog = (event: any) => {
        if (
            dialogRef &&
                !dialogRef.contains(event.target)//error here
        ) {
            alert('You clicked outside of me!');
            setIsDialogOpen(false);
          }
    };
    document.addEventListener('mousedown', handleClickOutsideDialog);

    return () => { 
        document.removeEventListener('mousedown', handleClickOutsideDialog);
    }
}, [setIsDialogOpen]);