当前位置:首页 > 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>;
}

监听点击事件

react如何监听document

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 缓存函数。

示例:依赖状态的监听

react如何监听document

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>;
}

事件委托优化

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

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 性能的方法 使用 React.memo 或 PureComponent 对于函数组件,使用 React.memo 进行记忆化,避免不必要的重新渲染。类组件可以使用 PureCompo…

如何记忆react

如何记忆react

理解核心概念 React的核心概念包括组件、状态(state)、属性(props)、生命周期方法(类组件)和钩子(函数组件)。掌握这些基础概念是记忆React的关键。组件是React应用的构建块,分为…

如何运行react

如何运行react

运行 React 项目的步骤 安装 Node.js 和 npm 确保系统已安装 Node.js(包含 npm)。可通过官网 Node.js 下载并安装最新稳定版本。安装完成后,验证版本: node…

react如何重置

react如何重置

重置 React 应用的状态 使用 useState 钩子重新初始化状态变量是最直接的方法。将状态变量重置为初始值或空值即可完成重置。 const [count, setCount] = useSt…

react如何通信

react如何通信

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

react如何折叠

react如何折叠

在 React 中实现折叠功能 使用 useState 管理折叠状态 通过 useState 定义一个状态变量来控制折叠面板的显示与隐藏。例如: const [isCollapsed, setIsC…