简体   繁体   English

如何读取事件侦听器内的状态?

[英]How to read state inside event listener?

I have the following code:我有以下代码:

//...
    const [ scale, setScale ] = useState(0.5);

    const [ altPressed, setAltPressed ] = useState(false);

    const handleScroll = ({ deltaY }) => {
        if (altPressed) {
            const newScale = scale + deltaY;

            setScale(newScale);
        }
    };

    const handleKeyPress = ({ altKey }) => {
        if (altKey) {
            setAltPressed(true);
        }
    };

    const handleKeyRelease = ({ altKey }) => {
        if (!altKey) {
            setAltPressed(false);
        }
    };

    useEffect(() => {
        window.addEventListener("wheel", handleScroll);
        window.addEventListener("keydown", handleKeyPress);
        window.addEventListener("keyup", handleKeyRelease);
    }, []);
//...

But unfortunately handleScroll always read the initial state of altPressed , which is false, even though the keyboard event listeners are working fine, and setting the states correctly.但不幸的是handleScroll总是读的初始状态altPressed ,这是假的,即使键盘事件侦听器工作正常,并正确设置状态。

How to solve this issue so it will always read the fresh state?如何解决这个问题,使其始终读取新鲜状态?

One way to go about it is to make your effect depend on altPressed , so that the event listeners will be recreated when it changes.一种方法是使您的效果依赖于altPressed ,以便在更改时重新创建事件侦听器。 You must make sure you remove the event listeners in a function returned from the function given to useEffect as well so you don't get any duplicated listeners or memory leaks.您必须确保删除从提供给useEffect的函数返回的函数中的事件侦听器,这样就不会出现任何重复的侦听器或内存泄漏。

useEffect(() => {
  window.addEventListener("wheel", handleScroll);
  window.addEventListener("keydown", handleKeyPress);
  window.addEventListener("keyup", handleKeyRelease);

  return () => {
    window.removeEventListener("wheel", handleScroll);
    window.removeEventListener("keydown", handleKeyPress);
    window.removeEventListener("keyup", handleKeyRelease);
  };
}, [altPressed]);

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

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