当前位置:首页 > React

react如何监听document

2026-03-31 05:43:57React

监听 document 事件的方法

在 React 中监听 document 对象的事件(如点击、滚动、键盘事件等)可以通过以下方式实现:

使用 useEffect 添加和移除事件监听

import React, { useEffect } from 'react';

function MyComponent() {
  useEffect(() => {
    const handleKeyDown = (event) => {
      console.log('Key pressed:', event.key);
    };

    document.addEventListener('keydown', handleKeyDown);

    return () => {
      document.removeEventListener('keydown', handleKeyDown);
    };
  }, []);

  return <div>Press any key to see console output</div>;
}

监听点击事件

useEffect(() => {
  const handleClick = (event) => {
    console.log('Clicked on:', event.target);
  };

  document.addEventListener('click', handleClick);

  return () => {
    document.removeEventListener('click', handleClick);
  };
}, []);

监听滚动事件

useEffect(() => {
  const handleScroll = () => {
    console.log('Window scrolled:', window.scrollY);
  };

  document.addEventListener('scroll', handleScroll);

  return () => {
    document.removeEventListener('scroll', handleScroll);
  };
}, []);

注意事项

  • 清理事件监听器:在 useEffect 的返回函数中移除事件监听器,避免内存泄漏。
  • 依赖数组:如果事件处理函数依赖组件状态或 props,需要将其添加到依赖数组中,或者使用 useCallback 缓存函数。

示例:依赖状态的监听

const [count, setCount] = useState(0);

useEffect(() => {
  const handleKeyDown = (event) => {
    if (event.key === 'Enter') {
      setCount(prev => prev + 1);
    }
  };

  document.addEventListener('keydown', handleKeyDown);

  return () => {
    document.removeEventListener('keydown', handleKeyDown);
  };
}, [setCount]); // 依赖 setCount

自定义 Hook 封装

可以将事件监听逻辑封装为自定义 Hook,方便复用:

import { useEffect } from 'react';

function useDocumentEvent(eventName, handler, dependencies = []) {
  useEffect(() => {
    document.addEventListener(eventName, handler);

    return () => {
      document.removeEventListener(eventName, handler);
    };
  }, dependencies);
}

// 使用示例
function MyComponent() {
  const handleKeyDown = (event) => {
    console.log('Key pressed:', event.key);
  };

  useDocumentEvent('keydown', handleKeyDown);

  return <div>Press any key</div>;
}

事件委托优化

如果需要在多个组件中监听同一事件,可以使用事件委托减少监听器数量:

react如何监听document

useEffect(() => {
  const handleGlobalClick = (event) => {
    if (event.target.matches('.my-button')) {
      console.log('Button clicked');
    }
  };

  document.addEventListener('click', handleGlobalClick);

  return () => {
    document.removeEventListener('click', handleGlobalClick);
  };
}, []);

以上方法适用于 React 函数组件。类组件可以通过 componentDidMountcomponentWillUnmount 实现类似逻辑。

标签: reactdocument
分享给朋友:

相关文章

react 如何分页

react 如何分页

分页实现方法 在React中实现分页功能可以通过多种方式完成,具体取决于数据来源(如API或本地数据)和UI库的选择。以下是常见的实现方法: 使用本地数据分页 对于存储在组件状态或Context中…

react如何浮动

react如何浮动

使用 CSS 实现浮动 在 React 中实现浮动效果可以通过 CSS 的 float 属性完成。在组件的样式文件或内联样式中直接设置 float: left 或 float: right。…

react如何拓展

react如何拓展

React 拓展方法 使用高阶组件(HOC) 高阶组件是一种复用组件逻辑的方式,通过接收一个组件并返回一个新组件实现功能拓展。例如,为组件添加日志功能: function withLogging…

react如何迭代

react如何迭代

在 React 中迭代数组或对象 React 提供了多种方式来处理数组或对象的迭代,以下是常见的方法: 使用 map 方法迭代数组 map 是 JavaScript 数组的内置方法,常用于在 Rea…

react如何开发

react如何开发

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

react如何通信

react如何通信

React 组件通信方式 React 组件间的通信方式多样,具体选择取决于组件关系和场景需求。以下是常见方法: 父子组件通信 父组件通过 props 向子组件传递数据,子组件通过回调函数通知父组件…