【问题标题】:React.js: useEffect with window resize event listener not workingReact.js:useEffect 与窗口调整大小事件侦听器不起作用
【发布时间】:2021-08-01 18:03:07
【问题描述】:

我正在使用此代码来侦听函数组件中的调整大小事件,并在调整窗口大小时重新呈现组件。问题是,任何一个事件侦听器都没有打印任何内容,所以我认为我对我在这里使用 useEffect 的方式有误解。

  const [dimensions, setDimensions] = React.useState({
    width: window.innerWidth,
    height: window.innerHeight,
  });

  useEffect(() => {
    const handleResize = () => {
      console.log(dimensions.width);
      setDimensions({
        width: window.innerWidth,
        height: window.innerHeight,
      });
      window.addEventListener("load", handleResize, false);
      window.addEventListener("resize", handleResize, false);
    };
  });

【问题讨论】:

  • 首先,您的window.addEventListener 调用在inside handleResize

标签: javascript reactjs react-hooks


【解决方案1】:
import { useState, useEffect } from "react";
// Usage
function App() {
  const size = useWindowSize();
  return (
    <div>
      {size.width}px / {size.height}px
    </div>
  );
}
// Hook
function useWindowSize() {
  // Initialize state with undefined width/height so server and client renders match
  // Learn more here: https://joshwcomeau.com/react/the-perils-of-rehydration/
  const [windowSize, setWindowSize] = useState({
    width: undefined,
    height: undefined,
  });
  useEffect(() => {
    // Handler to call on window resize
    function handleResize() {
      // Set window width/height to state
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight,
      });
    }
    // Add event listener
    window.addEventListener("resize", handleResize);
    // Call handler right away so state gets updated with initial window size
    handleResize();
    // Remove event listener on cleanup
    return () => window.removeEventListener("resize", handleResize);
  }, []); // Empty array ensures that effect is only run on mount
  return windowSize;
}

SOURCE

【讨论】:

  • 我认为这应该是公认的答案,特别是因为它处理事件监听器的清理。
  • 很棒的解决方案。也适用于 next.js,经过测试。
【解决方案2】:
const [dimensions, setDimensions] = React.useState({
    width: window.innerWidth,
    height: window.innerHeight,
  });
  console.log(dimensions);
  const handleResize = () => {
    setDimensions({
      width: window.innerWidth,
      height: window.innerHeight,
    });
  }
  React.useEffect(() => {
    window.addEventListener("resize", handleResize, false);
  }, []);

  

【讨论】:

  • 这很简单,谢谢!为什么监听器必须在 useEffect 挂钩内?为什么不能只添加一次?
猜你喜欢
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
相关资源
最近更新 更多