当前位置:首页 > React

react如何监听document

2026-01-23 22:33:25React

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

自定义 Hook 封装

将监听逻辑封装成自定义 Hook 以便复用。以下是一个监听 document 点击事件的 Hook 示例:

import { useEffect } from 'react';

function useDocumentClick(callback) {
  useEffect(() => {
    document.addEventListener('click', callback);
    return () => document.removeEventListener('click', callback);
  }, [callback]);
}

function MyComponent() {
  useDocumentClick(() => {
    console.log('Document clicked!');
  });

  return <div>Click anywhere on the page.</div>;
}

动态事件依赖

当事件处理函数依赖组件状态或 props 时,需将其包含在 useEffect 的依赖数组中,并使用 useCallback 优化性能:

react如何监听document

import React, { useEffect, useCallback, useState } from 'react';

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

  const handleScroll = useCallback(() => {
    console.log('Scrolled, current count:', count);
  }, [count]);

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

  return (
    <div style={{ height: '200vh' }}>
      <button onClick={() => setCount(c => c + 1)}>Increment: {count}</button>
    </div>
  );
}

注意事项

  • 清理监听器:务必在 useEffect 的清理函数中移除监听器,防止多次绑定。
  • SSR 兼容:在服务端渲染(SSR)场景中,document 可能不存在,需通过 typeof document !== 'undefined' 进行判断。
  • 事件类型:根据需求选择合适的事件类型(如 keydownclickscroll 等)。

标签: reactdocument
分享给朋友:

相关文章

如何提高react

如何提高react

优化性能 使用React.memo对组件进行记忆化处理,避免不必要的重新渲染。对于类组件,可以使用PureComponent来达到类似效果。 利用useMemo缓存计算结果,避免重复计算。对于函数或…

react elementUI

react elementUI

React 和 Element UI 是两个不同的技术栈,但可以通过整合实现类似功能。以下是相关解决方案和替代方案: React 与 Element UI 的替代方案 Element UI 是为 V…

react 如何引用slider

react 如何引用slider

使用 React 实现 Slider 组件 在 React 中实现 Slider 功能可以通过原生 HTML 的 <input type="range"> 或第三方库(如 react-sl…

react如何上传图片

react如何上传图片

使用input标签上传图片 在React中可以通过HTML的<input type="file">元素实现图片上传功能。创建一个受控组件来管理文件选择状态: function Image…

如何使用 react native

如何使用 react native

安装开发环境 确保已安装 Node.js(建议使用 LTS 版本)。通过以下命令安装 React Native 命令行工具: npm install -g expo-cli 或使用 Yarn: y…

react 如何显示html

react 如何显示html

渲染原始 HTML 在 React 中直接插入原始 HTML 需要使用 dangerouslySetInnerHTML 属性。这个属性允许将 HTML 字符串直接渲染到 DOM 中,但需要注意潜在的安…