繁体   English   中英

如何使用 useEffect Hook 只执行一次操作?

[英]How to use useEffect Hook to execute the operation only once?

如果有人离开 window,我想制作模态弹出窗口。

我尝试了以下代码:

React.useEffect(() => {
    const popupWhenLeave = (event) => {
      if (
        event.clientY <= 0 ||
        event.clientX <= 0 ||
        event.clientX >= window.innerWidth ||
        event.clientY >= window.innerHeight
      ) {
        handleClickOpen();
      }
    };
    document.addEventListener("mouseleave", popupWhenLeave);

    return () => {
      document.removeEventListener("mouseleave", popupWhenLeave);
    };
  }, []);

上面的代码帮助了我,但因为它在每个时间间隔都会弹出,所以变得很烦人。 我尝试添加一个新的 state 来只运行一次代码:

const [cursorOut, setCursorOut] = useState(false);

React.useEffect(() => {
    const popupWhenLeave = (event) => {
      if (
        event.clientY <= 0 ||
        event.clientX <= 0 ||
        event.clientX >= window.innerWidth ||
        event.clientY >= window.innerHeight
      ) {
        handleClickOpen();
      }
    };
    if(!cursorOut) {
       document.addEventListener("mouseleave", popupWhenLeave);
       setCursorOut(true);
    }

    return () => {
      document.removeEventListener("mouseleave", popupWhenLeave);
    };
  }, []);

上面的代码也和前面的代码一样运行,即每次弹出模式时。

我尝试将依赖项添加到 useEffect [cursorOut]但现在它不会弹出模式。

当 cursor 出来然后停止时,我只需要在页面上弹出一次模态框。

PS我也尝试过不使用useEffect,但它不起作用。

当依赖数组为空时,您的useEffect function被调用一次。 但是,您的useEffect function 向页面添加了一个事件侦听器,每次事件发生时都会调用该事件侦听器。

如果你只想监听一次事件,你应该在popupWhenLeave function 中删除事件监听器,而不仅仅是useEffect清理 function 你最后返回。

  React.useEffect(() => {
    const popupWhenLeave = (event) => {
      if (
        event.clientY <= 0 ||
        event.clientX <= 0 ||
        event.clientX >= window.innerWidth ||
        event.clientY >= window.innerHeight
      ) {
        handleClickOpen();
        document.removeEventListener("mouseleave", popupWhenLeave);
      }
    };
    document.addEventListener("mouseleave", popupWhenLeave);

    return () => {
      document.removeEventListener("mouseleave", popupWhenLeave);
    };
  }, []);

旁注:如果您的组件由于例如父组件更改而重新创建,则无论依赖数组的内容如何,都会再次调用useEffect function。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM