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

React中鼠标悬停仅显示当前元素的TestComponent问题排查

问题解决:仅在当前悬停的Symbol元素显示组件

问题根源

  1. 全局布尔状态导致批量触发
    你用MouseComponent这个布尔值作为所有元素的显示开关,只要状态设为true,所有Symbol元素的{MouseComponent ? <TestComponent /> : null}都会成立,自然全部显示组件。

  2. 索引判断逻辑错误
    你尝试用if(j)来触发状态,但数组索引从0开始,j=0时布尔判断为false,不会执行状态更新;而j>=1时判断为true,会把状态设为true,导致除第一个元素外,其他所有元素都显示组件。

正确实现方案

核心思路是存储当前悬停元素的唯一标识,而非全局布尔值。由于你的数据是双层数组,建议同时记录外层field索引和内层symbol索引,避免不同field里的相同索引导致冲突。

代码修改步骤:

  1. 替换原有的布尔状态,改为存储悬停元素的索引信息:
// 初始值设为null,表示没有元素被悬停
const [hoveredSymbol, setHoveredSymbol] = useState(null);
  1. 在渲染逻辑中,判断当前元素是否为悬停状态:
{Symbols.map((field, i) => {
  return (
    <div key={i}>
      {field.symbols.map((symbol, j) => {
        // 检查当前元素的索引是否和状态中存储的一致
        const isCurrentHovered = hoveredSymbol?.fieldIndex === i && hoveredSymbol?.symbolIndex === j;
        return (
          <div
            key={j}
            onMouseOver={() => setHoveredSymbol({ fieldIndex: i, symbolIndex: j })}
            onMouseLeave={() => setHoveredSymbol(null)}          
          >
            {symbol}
            {isCurrentHovered ? <TestComponent /> : null} 
          </div>
        );
      })}
    </div>
  );
})}

优化建议

如果你的symbol对象本身带有唯一ID(比如后端返回的id字段),建议用ID代替索引作为判断依据,这样即使数组元素顺序变化,也不会出现判断错误:

// 状态改为存储symbol的id
const [hoveredSymbolId, setHoveredSymbolId] = useState(null);

// 渲染时判断
{Symbols.map((field, i) => {
  return (
    <div key={i}>
      {field.symbols.map((symbol) => {
        const isCurrentHovered = hoveredSymbolId === symbol.id;
        return (
          <div
            key={symbol.id}
            onMouseOver={() => setHoveredSymbolId(symbol.id)}
            onMouseLeave={() => setHoveredSymbolId(null)}          
          >
            {symbol.name} {/* 假设symbol有name字段 */}
            {isCurrentHovered ? <TestComponent /> : null} 
          </div>
        );
      })}
    </div>
  );
})}

内容的提问来源于stack exchange,提问作者s.kuznetsov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:12:32