【问题标题】:Remove event listener issue in react js删除反应 js 中的事件侦听器问题
【发布时间】:2020-04-02 13:46:03
【问题描述】:
const ControlPanel = ({ mainSectionRef }) => {
    const [canMove, setCanMove] = useState(false)
    const classes = useStyles();
    const toolbarRef = useRef();

    const onMouseMove = function (e) {
        const { x, y } = getMouseCoordinatesOnCanvas(e, mainSectionRef.current);
        toolbarRef.current.style.left = x +'px';
        toolbarRef.current.style.top = y + 'px';
    }

    const setCan = () => {
        setCanMove(!canMove)
    }

    if (mainSectionRef.current) {
        //issue is here!!!!
        mainSectionRef.current.removeEventListener('mousemove', onMouseMove, true)
        if (canMove) {
            mainSectionRef.current.addEventListener('mousemove', onMouseMove, true)
        }
    }

    return (
        <Toolbar ref={toolbarRef}>
           <RadioButtonUncheckedIcon />
           <CropSquareIcon />
           <ArrowRightAltIcon />
           <CloseIcon />
           <DragIndicatorIcon style={{ backgroundColor: canMove ? "red" : "inherit" }} onClick={setCan}/>
        </Toolbar >
    );
}
export default ControlPanel;

每当组件中发生状态更改时,我都会尝试删除事件侦听器。 mainSectionref 是父 div,控制面板是子组件。我正在尝试在按钮的mainSectiononClick 中移动控制面板。该事件确实被添加但在状态更改时,它似乎并没有删除事件侦听器。我能知道出了什么问题吗?

【问题讨论】:

    标签: javascript reactjs dom-events


    【解决方案1】:
    useEffect(() => {
        function onMouseMove(e) {
            //Some code
        }
        if (mainSectionRef.current) {
            **mainSectionRef.current.onmousemove = null**;
            if (canMove) {
                mainSectionRef.current.onmousemove = e => onMouseMove(e);
            }
        }
    }, [canMove])
    

    问题已通过使用 onmousemove 键解决。我仍然不知道为什么 removeEventListener 在上述情况下不起作用。

    【讨论】:

      【解决方案2】:

      您应该使用 react 中的 useEffect 挂钩,并将您的 addEventListener 和 removeEventListener 代码作为第一个参数放入 useEffect 中。 useEffect 将第二个参数作为依赖项,这意味着 useEffect 应该调用的值更改。在您的情况下,您想在 canMove 更改时调用 useEffect。

        useEffect(() => {
         if (mainSectionRef.current) {
         mainSectionRef.current.removeEventListener('mousemove', onMouseMove, true)
           if (canMove) {
           mainSectionRef.current.addEventListener('mousemove', onMouseMove, true)
          }
         }
        }, [canMove]);
      

      还记得:import React, { useState, useEffect } from 'react';

      【讨论】:

      • 嗨 Zohaib,感谢您的回复。我很欣赏这种增强。不幸的是,问题仍然存在。 removeEventListener 似乎由于某种原因无法正常工作。如果有人能找出问题所在,那就太好了。不过,谢谢 zohaib 的建议。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 1970-01-01
      • 2022-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      相关资源
      最近更新 更多