当前位置:首页 > React

react如何监测窗口

2026-02-11 22:00:44React

监听窗口大小变化

在React中,可以通过useEffect钩子和window.addEventListener监听resize事件。当窗口大小变化时,更新组件状态以触发重新渲染。

import React, { useState, useEffect } from 'react';

function WindowSizeTracker() {
  const [windowSize, setWindowSize] = useState({
    width: window.innerWidth,
    height: window.innerHeight,
  });

  useEffect(() => {
    const handleResize = () => {
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight,
      });
    };

    window.addEventListener('resize', handleResize);
    return () => window.removeEventListener('resize', handleResize);
  }, []);

  return (
    <div>
      Window Width: {windowSize.width}, Height: {windowSize.height}
    </div>
  );
}

自定义Hook封装

将窗口监听逻辑封装为自定义Hook,便于复用。

import { useState, useEffect } from 'react';

function useWindowSize() {
  const [windowSize, setWindowSize] = useState({
    width: window.innerWidth,
    height: window.innerHeight,
  });

  useEffect(() => {
    const handleResize = () => {
      setWindowSize({
        width: window.innerWidth,
        height: window.innerHeight,
      });
    };

    window.addEventListener('resize', handleResize);
    return () => window.removeEventListener('resize', handleResize);
  }, []);

  return windowSize;
}

// 使用示例
function App() {
  const { width, height } = useWindowSize();
  return <div>Current Width: {width}</div>;
}

防抖优化性能

频繁触发resize事件可能影响性能,通过防抖(debounce)限制触发频率。

import { useState, useEffect } from 'react';

function useDebouncedWindowSize(delay = 250) {
  const [windowSize, setWindowSize] = useState({
    width: window.innerWidth,
    height: window.innerHeight,
  });

  useEffect(() => {
    let timeoutId;
    const handleResize = () => {
      clearTimeout(timeoutId);
      timeoutId = setTimeout(() => {
        setWindowSize({
          width: window.innerWidth,
          height: window.innerHeight,
        });
      }, delay);
    };

    window.addEventListener('resize', handleResize);
    return () => {
      window.removeEventListener('resize', handleResize);
      clearTimeout(timeoutId);
    };
  }, [delay]);

  return windowSize;
}

监听窗口滚动事件

类似地,可以通过scroll事件监听窗口滚动位置。

react如何监测窗口

import { useState, useEffect } from 'react';

function useWindowScroll() {
  const [scrollY, setScrollY] = useState(window.scrollY);

  useEffect(() => {
    const handleScroll = () => {
      setScrollY(window.scrollY);
    };

    window.addEventListener('scroll', handleScroll);
    return () => window.removeEventListener('scroll', handleScroll);
  }, []);

  return scrollY;
}

注意事项

  • 在组件卸载时务必移除事件监听,避免内存泄漏。
  • 服务端渲染(SSR)场景需兼容window对象是否存在,可通过typeof window !== 'undefined'判断。
  • 复杂场景可结合第三方库(如lodash.debounce)优化性能。

标签: 窗口react
分享给朋友:

相关文章

react如何取消渲染

react如何取消渲染

取消渲染的方法 在React中,取消渲染通常指的是在某些条件下阻止组件渲染或中断正在进行的渲染过程。以下是几种常见的方法: 条件渲染 通过条件判断决定是否渲染组件或部分内容。可以使用if语句或三元运…

如何手写一个react

如何手写一个react

手写一个简单的 React 创建一个基础的 React 实现需要理解其核心概念:虚拟 DOM、组件、状态管理和渲染。以下是一个简化版的 React 实现。 创建虚拟 DOM 虚拟 DOM 是真实 D…

如何改造react

如何改造react

改造 React 项目的关键方法 分析当前项目结构 通过评估现有组件、状态管理和依赖项,明确需要改进的部分。使用工具如 webpack-bundle-analyzer 识别性能瓶颈。 升级 Reac…

react如何验证

react如何验证

表单验证方法 在React中验证表单数据通常使用以下几种方式: 内置HTML5验证 利用HTML5原生表单验证属性如required、pattern等,结合form.noValidate属性禁用浏览…

如何提高react

如何提高react

优化性能 使用React.memo对组件进行记忆化处理,避免不必要的重新渲染。对于类组件,可以使用PureComponent来达到类似效果。 利用useMemo缓存计算结果,避免重复计算。对于函数或…

如何清洁react

如何清洁react

清洁 React 项目的方法 删除未使用的依赖项 运行 npm ls 或 yarn list 检查已安装的依赖项,使用 npm uninstall <package> 或 yarn rem…