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

React Hooks实现列表hover时仅触发当前元素效果的问题求助

问题原因

你当前所有列表项共用同一个inHover布尔状态,只要任意一个元素触发hover修改状态,所有列表项的判断条件{inHover && ...}都会生效,所以所有图片都会显示hover效果。另外原代码还存在map遍历未加key、多处重复定义id、错把className写成class的小问题,后续方案会一并修正。

解决方案1:状态存储当前hover的元素ID

修改状态存储值为当前悬停元素的ID,初始值为null,仅当当前遍历项的ID和状态中存储的ID一致时,才显示hover效果。
修改后的代码:

import React, { useState } from 'react';
import intialState from '../../intialState';
import '../styles/components/banner.css';

const Banner = () => {
    const home = intialState.itemsHome;
    // 存储当前hover的元素id,初始为null
    const [hoverId, setHoverId] = useState(null);
    return (
        <div className="container h-100" >
            <div className="row align-middle">
            {home.map((item)=>{
               return (
                <div 
                  key={item.id}
                  className="col-md-6 col-lg-4 column"  
                  onMouseEnter={() => setHoverId(item.id)} 
                  onMouseLeave={() => setHoverId(null)} 
                >
                  <div className="card gr-1" style={{position:'absolute'}} >
                    <img src={item.src} style={{position:'absolute'}}  className="image"  />
                    {/* 仅当前项id等于hover的id时显示效果 */}
                    {hoverId === item.id && <div className="info" style={{position:'absolute'}}></div>}
                  </div>  
               </div> 
               );
             }) } 
            </div>
        </div>
    );
}

export default Banner;
解决方案2:抽离独立子组件

把每个列表项封装成单独的子组件,每个子组件自己维护独立的hover状态,互相完全隔离,更符合组件拆分的最佳实践。
代码示例:

import React, { useState } from 'react';
import intialState from '../../intialState';
import '../styles/components/banner.css';

// 抽离的独立列表项组件
const BannerItem = ({item}) => {
  // 每个子组件自己维护hover状态,互不影响
  const [inHover, setHover] = useState(false);
  return (
    <div 
      className="col-md-6 col-lg-4 column"  
      onMouseEnter={() => setHover(true)} 
      onMouseLeave={() => setHover(false)} 
    >
      <div className="card gr-1" style={{position:'absolute'}} >
        <img src={item.src} style={{position:'absolute'}}  className="image"  />
        {inHover && <div className="info" style={{position:'absolute'}}></div>}
      </div>  
   </div> 
  )
}

const Banner = () => {
    const home = intialState.itemsHome;
    return (
        <div className="container h-100" >
            <div className="row align-middle">
              {home.map((item)=> <BannerItem key={item.id} item={item} />)}
            </div>
        </div>
    );
}

export default Banner;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:48:05