react hooks 中使用 addEventListener 监听事件无法访问到最新的 state 的问题

示例:

const Exposure = (props: IExposure) => {
  const [hasAsyncData, SetHasAsyncData] = useState(false);

  useEffect(() => {
    if (props.asyncData) {
      SetHasAsyncData(true);
    }
  }, [props.asyncData]);

  useEffect(() => {
    window.addEventListener("touchmove", handleMove, false);
    window.addEventListener("scroll", handleMove, false);
    return () => {
      window.removeEventListener("touchmove", handleMove);
      window.removeEventListener("scroll", handleMove);
    };
  }, []);

  function handleMove() {
    console.log(hasAsyncData);
  }
  return <div ref={measuredRef}></div>;
};

export default Exposure;

如上述代码所示,props.asyncData 变化之后 hasAsyncData 设置为 true,然后滚动页面,handleMove 中的 hasAsyncData 仍然为初始值 false。
所以这时要在 hasAsyncData 变化后,重新绑定 addEventListener 事件

useEffect(() => {
  }, [hasAsyncData])

在useEffect中将他监听起来,从新绑定

const Exposure = (props: IExposure) => {
  const [hasAsyncData, SetHasAsyncData] = useState(false);

  useEffect(() => {
    if (props.asyncData) {
      SetHasAsyncData(true);
    }
  }, [props.asyncData]);

  useEffect(() => {
    window.addEventListener("touchmove", handleMove, false);
    window.addEventListener("scroll", handleMove, false);
    return () => {
      window.removeEventListener("touchmove", handleMove);
      window.removeEventListener("scroll", handleMove);
    };
  }, [hasAsyncData]); //改动了这里

  function handleMove() {
    console.log(hasAsyncData);
  }
  return <div ref={measuredRef}></div>;
};

export default Exposure;

相关推荐

  1. 监听 Redis key 过期事件无效问题

    2024-01-17 06:22:02       36 阅读
  2. addEventListener()方法参数,以及作用

    2024-01-17 06:22:02       33 阅读
  3. 关于配置SSL,但是无法使用https访问问题

    2024-01-17 06:22:02       35 阅读
  4. 监测vuexstate变化

    2024-01-17 06:22:02       26 阅读
  5. 解决elementUI使用checkbox无法选中问题

    2024-01-17 06:22:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-17 06:22:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-17 06:22:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-17 06:22:02       82 阅读
  4. Python语言-面向对象

    2024-01-17 06:22:02       91 阅读

热门阅读

  1. rsync

    2024-01-17 06:22:02       52 阅读
  2. 光伏发电系统的MPPT控制策略研究

    2024-01-17 06:22:02       45 阅读