zoukankan      html  css  js  c++  java
  • 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;
    
  • 相关阅读:
    支付宝生活号授权获取用户信息
    jQuery选项卡
    多图上传加验证加修改file样式
    微信小程序上传图片单张
    圣诞节的整理前两周的内容5
    圣诞节的整理前两周的内容4
    圣诞节的整理前两周的内容3
    圣诞节的整理前两周的内容2
    圣诞节的整理前两周的内容1
    2018.12.14——函数作用域
  • 原文地址:https://www.cnblogs.com/xiaozhumaopao/p/14452589.html
Copyright © 2011-2022 走看看