• 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 事件

    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;
    
  • 相关阅读:
    The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored(E F G H I)
    Ubuntu iso下载地址(14、16、18)
    JS解决在提交form表单时某个值不存在 alter弹窗点确定不刷新界面
    搞搞电脑微信表情的破解(.dat转png or jpg)
    12.29 模拟赛
    bzoj 2151 种树
    bzoj 5110 Yazid的新生舞会
    【系列】 点分治
    12.8 模拟赛
    12.17 模拟赛
  • 原文地址:https://www.cnblogs.com/xiaozhumaopao/p/14452589.html
Copyright © 2020-2023  润新知