You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断鼠标是否悬停在特定React组件?求非jQuery/原生JS方案

React组件悬停状态判断与行为控制方案

问题描述

我需要在鼠标悬停应用内某个特定React组件时,根据这个条件停止部分行为。目前只找到基于jQuery和原生JavaScript的旧解决方案,想知道有没有其他可行的实现方式?

目标组件代码如下:

<ContentRightHandSide offset={bannerHidden ? 80 : 120}>
  <ContentTitle>
    Activity
    <img
      style={{
        display: "inline",
        position: "relative",
        marginLeft: "20px",
        width: "35px",
      }}
      src={calendarIcon}
    />
  </ContentTitle>

  {authStatus === "authenticated" ? (
    <ShareLogs
      linkShareLogs={activeShareLogs}
      isBannerHidden={bannerHidden}
      hovered={hoveredNode}
      selected={selectedNode}
    />
  ) : (
    <div style={{ position: "relative" }}>
      <img
        src={blurredScreenLinks}
        style={{
          fontSize: "24px",
          position: "relative",
          margin: "0 auto",
          width: "100%",
        }}
      />

      <button
        style={{
          backgroundColor: "#F7F1FF",
          color: "#35373B",
          position: "absolute",
          fontFamily: "lato",
          left: "0",
          right: "0",
          marginLeft: "auto",
          marginRight: "auto",
          width: "320px",
          top: "100px",
          padding: "0px 20px",
          display: "flex",
          alignItems: "center",
          borderRadius: "60px",
        }}
        onClick={handleSignInClick}
      >
        <img
          style={{
            display: "inline",
            position: "relative",
            width: "80px",
            cursor: "pointer",
            margin: "-5px",
          }}
          src={slackIcon}
        />
        <span style={{ textAlign: "left" }}>
          Lorem Ipsum                  
        </span>
      </button>
    </div>
  )}
</ContentRightHandSide>

可行实现方案

方式一:React内置状态+鼠标事件绑定

直接给目标组件添加onMouseEnter和onMouseLeave事件,配合useState维护悬停状态,后续在需要控制行为的逻辑中判断该状态即可。

示例代码:

import { useState } from 'react';

// 组件内部状态定义
const [isHovering, setIsHovering] = useState(false);

// 修改目标组件,绑定鼠标事件
<ContentRightHandSide
  offset={bannerHidden ? 80 : 120}
  onMouseEnter={() => setIsHovering(true)}
  onMouseLeave={() => setIsHovering(false)}
>
  {/* 原有组件内容 */}
</ContentRightHandSide>

// 在需要控制行为的逻辑中使用状态判断
const someFunction = () => {
  if (isHovering) {
    // 停止当前行为,直接返回或跳过执行
    return;
  }
  // 正常执行的业务逻辑
};

方式二:自定义Hook封装悬停逻辑

如果多个组件需要复用悬停判断逻辑,可以封装成自定义Hook,提升代码复用性。

示例代码:

import { useState, useCallback } from 'react';

// 自定义悬停Hook
const useHover = () => {
  const [isHovered, setIsHovered] = useState(false);

  const handleMouseEnter = useCallback(() => setIsHovered(true), []);
  const handleMouseLeave = useCallback(() => setIsHovered(false), []);

  return {
    isHovered,
    handlers: {
      onMouseEnter: handleMouseEnter,
      onMouseLeave: handleMouseLeave
    }
  };
};

// 在组件中使用Hook
const { isHovered, handlers } = useHover();

<ContentRightHandSide
  offset={bannerHidden ? 80 : 120}
  {...handlers}
>
  {/* 原有组件内容 */}
</ContentRightHandSide>

// 同样通过isHovered状态控制行为
if (isHovered) {
  // 停止对应行为
}

方式三:针对第三方组件的DOM监听

如果目标组件是第三方库提供的,没有暴露鼠标事件props,可以通过useRef获取DOM元素,手动添加原生事件监听。

示例代码:

import { useState, useEffect, useRef } from 'react';

// 创建Ref引用目标组件DOM
const contentRef = useRef(null);
const [isHovering, setIsHovering] = useState(false);

useEffect(() => {
  const targetElement = contentRef.current;
  if (!targetElement) return;

  // 定义事件处理函数
  const handleMouseEnter = () => setIsHovering(true);
  const handleMouseLeave = () => setIsHovering(false);

  // 添加事件监听
  targetElement.addEventListener('mouseenter', handleMouseEnter);
  targetElement.addEventListener('mouseleave', handleMouseLeave);

  // 组件卸载时清理事件监听
  return () => {
    targetElement.removeEventListener('mouseenter', handleMouseEnter);
    targetElement.removeEventListener('mouseleave', handleMouseLeave);
  };
}, []);

// 给目标组件绑定Ref
<ContentRightHandSide
  ref={contentRef}
  offset={bannerHidden ? 80 : 120}
>
  {/* 原有组件内容 */}
</ContentRightHandSide>

内容的提问来源于stack exchange,提问作者deadant88

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:10:25