如何在 React 中实现一个自定义 Hook 来监听窗口大小变化?

如何在 React 中实现一个自定义 Hook 来监听窗口大小变化?

回答与解析:

可以使用 useState 和 useEffect 创建一个自定义 Hook,例如 useWindowSize,来监听窗口的 resize 事件并实时更新窗口尺寸。

示例代码如下:

import { useState, useEffect } from 'react';

function useWindowSize() {
  const [windowSize, setWindowSize] = useState({
    width: undefined,
    height: undefined,
  });

  useEffect(() => {
    // 处理 resize 事件的回调函数
    function handleResize() {
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight,
      });
    }

    // 组件挂载时立即获取一次尺寸
    handleResize();

    // 添加事件监听器
    window.addEventListener('resize', handleResize);

    // 清理函数:组件卸载时移除监听器
    return () => window.removeEventListener('resize', handleResize);
  }, []); // 依赖数组为空,仅在挂载和卸载时执行

  return windowSize;
}

// 使用示例
function MyComponent() {
  const { width, height } = useWindowSize();
  return <div>Window size: {width} x {height}</div>;
}

解析:

  • 自定义 Hook 封装了与窗口尺寸相关的逻辑,便于复用。
  • 使用 useEffect 在组件挂载时添加事件监听,并在卸载时清理,防止内存泄漏。
  • 初始状态设为 undefined 是为了避免服务端渲染(SSR)时 window 对象不存在导致的错误。
  • 此 Hook 可用于响应式布局、动态调整组件尺寸等场景。

发表评论 (审核通过后显示评论):

昵称:
邮箱:
内容: