发布于 2026-01-06 4 阅读
0

编写自定义 useWindowSize React Hook useWindowSize 的作用 编写 Hook 观看演示

编写自定义 useWindowSize React Hook

useWindowSize 的作用

撰写引子

观看实际演示

React Hooks 最酷的功能之一就是你可以创建自己的 Hook!在这篇文章中,我们将快速编写我们自己的useWindowSizeHook。

useWindowSize 的作用

今天我们要创建useWindowSize自定义钩子,是为了确保在窗口innerHeight及其innerWidth属性发生变化时,我们始终能够访问它们。为此,我们将接入窗口的onresize事件监听器。

撰写引子

由于我们需要维护窗口大小信息,我们将使用useState一个包含初始窗口的二元数组作为默认值。

const { useState } = React;

function useWindowSize() {
  const [size, setSize] = useState([window.innerHeight, window.innerWidth]);
  return size;
}
Enter fullscreen mode Exit fullscreen mode

当然,这不会是动态的。要实现动态效果,我们需要使用窗口大小调整事件处理程序。现在,我们只需要设置一次事件监听器,所以我们会使用一个useEffect带有空依赖数组的钩子来实现。

const { useEffect, useState } = React;

function useWindowSize() {
  const [size, setSize] = useState([window.innerHeight, window.innerWidth]);
  useEffect(() => {
    const handleResize = () => { 
      setSize([window.innerHeight, window.innerWidth]);
    }
    window.addEventListener("resize", handleResize);
  }, []);
  return size;
}
Enter fullscreen mode Exit fullscreen mode

太棒了,现在我们已经添加了一个事件监听器,setSize每当我们的窗口大小调整时,我们都会收到通知。

我们还需要做最后一件事:在我们的钩子函数中添加一个清理函数useEffect,以确保在组件卸载时移除事件监听器。

const { useEffect, useState } = React;

function useWindowSize() {
  const [size, setSize] = useState([window.innerHeight, window.innerWidth]);
  useEffect(() => {
    const handleResize = () => { 
      setSize([window.innerHeight, window.innerWidth]);
    }
    window.addEventListener("resize", handleResize);
    // Clean up!
    return () => {
      window.removeEventListener("resize", handleResize);
    };
  }, []);
  return size;
}
Enter fullscreen mode Exit fullscreen mode

观看实际演示

我们的最终代码和 Codepen 示例如下!

const { useEffect, useState } = React;

function useWindowSize() {
  const [size, setSize] = useState([window.innerHeight, window.innerWidth]);
  useEffect(() => {
    const handleResize = () => { 
      setSize([window.innerHeight, window.innerWidth]);
    }
    window.addEventListener("resize", handleResize);
    // Clean up!
    return () => {
      window.removeEventListener("resize", handleResize);
    };
  }, []);
  return size;
}

const App = () => {
  const [height, width] = useWindowSize();
  return(
    <div className="box">
      <h1>useWindowSize Hook</h1>
      <p>
        height: {height}<br />
        width: {width}
      </p>
    </div>
  );
}
Enter fullscreen mode Exit fullscreen mode

文章来源:https://dev.to/nas5w/writing-a-custom-usewindowsize-react-hook-4b2a