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

React循环渲染项添加active类后无法移除的问题求助

问题修复:点击关闭按钮无法移除active类

问题根源

关闭按钮的点击事件会冒泡到上层绑定了setActive(DataGroups)的父容器,导致执行顺序是:先触发setActive(false),紧接着父容器的事件又把active设回当前的DataGroups对象,最终active类没被移除。

修复方案

方案1:阻止关闭按钮的事件冒泡(推荐)

给关闭按钮的点击事件添加stopPropagation(),同时建议用null重置状态(和初始值保持一致,逻辑更统一):

const lightbox = () => {
    const [active, setActive] = useState(null);

  return (
    <div>
    {DataGroups.map((group, idx) => { // 变量名改为group避免和数组名重复,提升可读性
    return (
        <div key={group.id}>
            <div 
              onClick={() => setActive(group)} 
              className={`groups-card rounded-mainRadius ${active === group ? 'active' : ''}`} // 用===严格相等,避免隐式类型转换问题
            >
                <div className="groups-card-lightbox">
                    <h2>{group.title}</h2>
                    <p className="groups-card-description">
                        {group.description}
                    </p>
                    <div 
                      onClick={(e) => { 
                        e.stopPropagation(); // 阻止事件冒泡到父元素
                        setActive(null); 
                      }} 
                      className="font-bold hover:text-green"
                    >
                        Close the lightbox
                    </div>
                </div>
                <h2 className="groups-card-title">{group.title}</h2>
            </div>
        </div>
        )
    })}
    </div>
  )
}

方案2:调整DOM结构(如果布局允许)

把关闭按钮移到绑定了点击事件的父容器外面,这样点击关闭时不会触发父容器的setActive逻辑:

// 示例结构调整
<div key={group.id}>
    <div 
      onClick={() => setActive(group)} 
      className={`groups-card rounded-mainRadius ${active === group ? 'active' : ''}`}
    >
        <div className="groups-card-lightbox">
            <h2>{group.title}</h2>
            <p className="groups-card-description">
                {group.description}
            </p>
        </div>
        <h2 className="groups-card-title">{group.title}</h2>
    </div>
    {/* 关闭按钮移到父容器外 */}
    <div 
      onClick={() => setActive(null)} 
      className="font-bold hover:text-green"
    >
        Close the lightbox
    </div>
</div>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:00:08