React.js:useEffect 与窗口调整大小事件侦听器不起作用

Jas*_*ang 17 javascript reactjs react-hooks

我使用此代码来侦听函数组件中的调整大小事件,并在调整窗口大小时重新渲染该组件。问题是,任何一个事件监听器都没有打印出任何内容,所以我认为我对这里如何使用 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);
    };
  });
Run Code Online (Sandbox Code Playgroud)

fra*_*cis 36

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;
}
Run Code Online (Sandbox Code Playgroud)

来源

  • 我认为这应该是公认的答案,特别是因为它处理事件侦听器的清理。 (6认同)
  • 很棒的解决方案。也适用于 next.js,经过测试。 (2认同)

小智 20

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);
}, []);

  
Run Code Online (Sandbox Code Playgroud)

  • 这很干净简单,谢谢!为什么监听器必须位于 useEffect 挂钩内?为什么不能只添加一次? (2认同)