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

React开发:如何实现hover单条列表项时仅在当前项显示X按钮

问题根因

你代码中声明的over是List组件的全局公共状态,所有列表项都复用这一个状态控制X按钮的显隐,自然会触发一处hover所有项都显示X的问题。

解决方案

方案1:纯CSS实现(更推荐)

完全不需要修改JS逻辑,也不需要额外维护状态,性能最优,只需要在你的list.css中添加如下样式:

/* 默认隐藏关闭按钮 */
.item-name .close-x {
  display: none;
}
/* 仅当前hover的列表项显示关闭按钮 */
.item-name:hover .close-x {
  display: block;
}

然后修改你的JSX代码,删掉原来的over状态、mouseOver方法以及li上绑定的鼠标事件,将X按钮的p标签修改为:
<p className="close-x">X</p>

方案2:JS状态控制

如果有特殊场景需要用JS控制显隐,可以将状态修改为存储当前hover的列表项索引,修改后的完整代码如下:

import React, { useState } from "react";
import "./list.css";

function List({ items }) {
  // 存储当前hover的列表项索引,默认-1表示没有hover任何项
  const [hoverIndex, setHoverIndex] = useState(-1);

  return (
    <ul>
      {items.map((item, i) => {
        return (
          <li
            onMouseOver={() => setHoverIndex(i)}
            onMouseOut={() => setHoverIndex(-1)}
            style={{
              borderRight: `5px solid ${item.amount < 0 ? "red" : "green"}`,
            }}
            key={i}
            className="item-name"
          >
            <p>{item.itemName}</p>
            <p>{item.amount}</p>
            {/* 仅当前索引等于hover索引时显示X */}
            <p style={{ display: hoverIndex === i ? "block" : "none" }}>X</p>
          </li>
        );
      })}
    </ul>
  );
}

export default List;
效果示意图

列表交互效果示意图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:24:00