当前位置:首页 > React

react如何检测窗口

2026-02-26 03:02:16React

监听窗口大小变化

使用 useEffect 钩子监听 resize 事件,并在组件卸载时清除监听。

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>
      Window Width: {width}, Window Height: {height}
    </div>
  );
}

监听窗口滚动事件

通过 useEffect 监听 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;
}

function App() {
  const scrollY = useWindowScroll();
  return <div>Current Scroll Position: {scrollY}px</div>;
}

检测窗口是否可见

使用 document.visibilityState 监听窗口是否可见(如切换标签页或最小化浏览器)。

react如何检测窗口

import { useState, useEffect } from 'react';

function useWindowVisibility() {
  const [isVisible, setIsVisible] = useState(!document.hidden);

  useEffect(() => {
    const handleVisibilityChange = () => {
      setIsVisible(!document.hidden);
    };

    document.addEventListener('visibilitychange', handleVisibilityChange);
    return () => {
      document.removeEventListener('visibilitychange', handleVisibilityChange);
    };
  }, []);

  return isVisible;
}

function App() {
  const isVisible = useWindowVisibility();
  return <div>Window is {isVisible ? 'visible' : 'hidden'}</div>;
}

监听窗口失去焦点

通过 blurfocus 事件检测浏览器窗口是否处于活跃状态。

import { useState, useEffect } from 'react';

function useWindowFocus() {
  const [isFocused, setIsFocused] = useState(document.hasFocus());

  useEffect(() => {
    const handleFocus = () => setIsFocused(true);
    const handleBlur = () => setIsFocused(false);

    window.addEventListener('focus', handleFocus);
    window.addEventListener('blur', handleBlur);

    return () => {
      window.removeEventListener('focus', handleFocus);
      window.removeEventListener('blur', handleBlur);
    };
  }, []);

  return isFocused;
}

function App() {
  const isFocused = useWindowFocus();
  return <div>Window is {isFocused ? 'focused' : 'not focused'}</div>;
}

使用第三方库简化操作

如果不想手动实现,可以使用 react-use@react-hook/window-size 等库快速实现窗口检测功能。

import { useWindowSize } from '@react-hook/window-size';

function App() {
  const [width, height] = useWindowSize();
  return (
    <div>
      Window Size: {width}x{height}
    </div>
  );
}

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

相关文章

react实现vue

react实现vue

React 实现 Vue 功能 React 和 Vue 是两种不同的前端框架,但可以通过一些方法在 React 中实现 Vue 的特性。以下是几种常见 Vue 功能在 React 中的实现方式: 双…

如何react页面

如何react页面

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

如何下载react

如何下载react

下载 React 的方法 通过 npm 或 yarn 安装 React 可以通过包管理器 npm 或 yarn 安装。确保已安装 Node.js(包含 npm),然后在项目目录中运行以下命令:…

react如何开发

react如何开发

React 开发基础步骤 安装 Node.js 和 npm/yarn 确保系统已安装 Node.js(包含 npm)或 Yarn。React 项目依赖这些工具管理包和运行脚本。官方推荐使用 Node.…

react如何调度

react如何调度

React 调度机制概述 React 的调度机制通过 Fiber 架构 和 Scheduler 模块实现任务优先级管理与时间切片(Time Slicing),确保高优先级更新(如用户交互)能快速响应,…

如何调试react

如何调试react

调试 React 应用的方法 使用 React Developer Tools 安装浏览器扩展(Chrome/Firefox),通过组件树查看组件状态、props 和 hooks。支持实时编辑 pro…