当前位置:首页 > 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 事件,获取滚动位置。

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 监听窗口是否可见(如切换标签页或最小化浏览器)。

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 等库快速实现窗口检测功能。

react如何检测窗口

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

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

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

相关文章

react如何销毁

react如何销毁

销毁 React 组件 在 React 中,销毁组件通常涉及清理副作用(如事件监听器、定时器或订阅)以防止内存泄漏。以下是实现组件销毁的常见方法: 使用 useEffect 清理副作用 在函数组件…

react如何收录

react如何收录

React 收录方法 React 的收录主要涉及搜索引擎优化(SEO)和预渲染技术。由于 React 是单页应用(SPA),默认情况下内容由 JavaScript 动态生成,可能导致搜索引擎爬虫难以收…

react 如何调试

react 如何调试

调试 React 应用的方法 使用 React Developer Tools 安装 Chrome 或 Firefox 的 React Developer Tools 扩展,可以检查组件树、状态和 p…

react如何检测

react如何检测

检测 React 应用的方法 使用 PropTypes 进行类型检查 PropTypes 是 React 内置的类型检查工具,用于验证组件的 props 是否符合预期。在开发环境中,PropTypes…

react如何下载

react如何下载

安装 React 的步骤 通过 npm 或 yarn 安装 React,确保已安装 Node.js(版本建议 ≥ 14.0.0)。打开终端或命令行工具,运行以下命令: npx create-reac…

react如何引入

react如何引入

引入React的方法 React可以通过多种方式引入项目,具体取决于项目需求和开发环境。以下是常见的几种方法: 通过CDN引入 在HTML文件中直接通过CDN链接引入React和ReactDOM:…