当前位置:首页 > React

react如何检测窗口

2026-03-30 19:50:51React

检测窗口变化的方法

使用 window.addEventListener

在React中监听窗口变化可以通过原生JavaScript的window.addEventListener实现。通常在useEffect中设置监听器,并在组件卸载时移除。

import { useEffect } from 'react';

function useWindowResize() {
  useEffect(() => {
    const handleResize = () => {
      console.log(window.innerWidth, window.innerHeight);
    };

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

自定义Hook封装

将窗口尺寸检测逻辑封装为自定义Hook,便于复用。返回当前窗口尺寸的实时状态。

import { useState, useEffect } from 'react';

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

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

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

  return size;
}

使用第三方库

若需复杂功能(如防抖、响应式断点),可使用react-use@react-hook/resize-observer等库简化实现。

import { useWindowSize } from 'react-use';

function Component() {
  const { width, height } = useWindowSize();
  return <div>Window size: {width}x{height}</div>;
}

断点检测实现

结合CSS断点检测窗口宽度范围,常用于响应式设计。

function useBreakpoint() {
  const [breakpoint, setBreakpoint] = useState('');

  useEffect(() => {
    const checkBreakpoint = () => {
      const width = window.innerWidth;
      if (width < 768) setBreakpoint('mobile');
      else if (width < 1024) setBreakpoint('tablet');
      else setBreakpoint('desktop');
    };

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

  return breakpoint;
}

性能优化

高频事件如resize需使用防抖(debounce)或节流(throttle)减少性能损耗。

react如何检测窗口

import { useEffect } from 'react';
import { debounce } from 'lodash';

function useDebouncedResize(callback, delay = 100) {
  useEffect(() => {
    const debouncedCallback = debounce(callback, delay);
    window.addEventListener('resize', debouncedCallback);
    return () => {
      debouncedCallback.cancel();
      window.removeEventListener('resize', debouncedCallback);
    };
  }, [callback, delay]);
}

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

相关文章

电脑如何安装react

电脑如何安装react

安装 Node.js 和 npm React 依赖于 Node.js 和 npm(Node Package Manager)。从 Node.js 官网下载并安装最新稳定版本,安装完成后会自动包含 np…

如何react页面

如何react页面

创建 React 页面 使用 create-react-app 快速初始化项目: npx create-react-app my-app cd my-app npm start 基础页面结构 在 s…

如何实操react

如何实操react

安装 React 环境 使用 create-react-app 快速搭建项目: npx create-react-app my-app cd my-app npm start 项目启动后默认在…

react如何上传文件

react如何上传文件

使用React上传文件的方法 使用HTML的input元素和FormData 创建一个文件输入字段,通过onChange事件获取文件对象,使用FormData将文件数据发送到服务器。 import…

vscode如何开发react

vscode如何开发react

使用 VSCode 开发 React 的配置指南 安装必要工具 确保 Node.js 和 npm/yarn 已安装,可以通过终端输入 node -v 和 npm -v 检查版本。若未安装,需从官网下载…

react如何传递参数

react如何传递参数

传递 props 给子组件 在父组件中通过属性名直接传递数据,子组件通过 props 对象接收。例如父组件传递 name 和 age: <ChildComponent name="John"…