javascript - 使用 React hook useState 在其中一个单元格悬停时突出显示表格的一行时出现问题?

标签 javascript html css reactjs react-hooks

我有一个显示列表的表格。 每行有 3 列:itemdelete-button-1delete-button-2。 当悬停在删除按钮上时,相应的元素以红色突出显示。

我正在使用 React Hook useState 来存储悬停删除按钮的行的索引。

我有两个删除按钮的实现,唯一的区别在于 onClick 属性。 两种实现方式都有问题。


删除按钮:实现1

  1. 将元素添加到列表
  2. 删除所有元素
  3. 向列表中添加新元素

问题是新列表的第一项以红色突出显示,直到删除按钮悬停时才会删除。


删除按钮:实现2

  1. 将元素添加到列表
  2. 删除一个元素

问题是,虽然下一行的删除按钮出现在已删除行的删除按钮的位置,但直到重新悬停此删除按钮时,该元素才会突出显示。


let id = 0
const {useState} = React

const Table = () => {
  const [list, setList] = useState([])
  const [warningIndex, setWarning] = useState(null)

  const rows = list.map((item, index) => {
    const rowClass = (warningIndex === index) ? "warning" : ""

    return (
      <tr key={index}>
        <td className={rowClass}>{item}</td>
        <td
          className="delete-button"
          onMouseEnter={() => setWarning(index)}
          onMouseLeave={() => setWarning(null)}
          onClick={() => setList([...list.slice(0, index), ...list.slice(index + 1)])}>
          -
        </td>
        <td
          className="delete-button"
          onMouseEnter={() => setWarning(index)}
          onMouseLeave={() => setWarning(null)}
          onClick={() => {
            setList([...list.slice(0, index), ...list.slice(index + 1)])
            setWarning(null)
          }}>
          -
        </td>
      </tr>
    )
  })

  return (
    <table>
      <tbody>
      <tr>
        <td
          className="add-button"
          colSpan="3"
          onClick={() => setList([...list, id++])}>
          +
        </td>
      </tr>
      {rows}
      </tbody>
    </table>
  )
}

ReactDOM.render(<Table/>, document.getElementById('root'));
table {
  width: 200px;
  border-collapse: collapse;
}

td {
  padding: 4px 8px;
  border: 1px solid lightgrey;
}

td.add-button, td.delete-button {
  cursor: pointer;
  width: 1%;
}

td.add-button:hover {
  background-color: lightgrey;
}

td.add-button:active {
  background-color: darkgrey;
}

td.delete-button:hover {
  background-color: #ffcdd2;
}

td.delete-button:active, td.warning {
  background-color: #ef9a9a;
}
<script <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="root"></div>

我想要一个没有任何这些问题的删除按钮的实现。我只想要一个删除按钮,这两个是我试过的。

最佳答案

任何时候你的映射 react 和使用索引作为键,它都有可能导致问题,特别是在添加和删除组件时。

  return (
      <tr key={index}>

使用唯一 key 可能会解决您的问题。有关 React 键的更多信息 React Keys

关于javascript - 使用 React hook useState 在其中一个单元格悬停时突出显示表格的一行时出现问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58435881/

相关文章:

javascript - AWStats 还是谷歌分析?哪个更准确?

javascript - 使用 selenium webdriver 在 IE11 中右键/上下文单击无法正常工作

html - 在高度上扩展页面内容或在内容下方显示白色背景

html - 响应式设计 : Site not shrinking past 763px

html - bootstrap Jumbotron - 设置边框时看不到底部边框,这是为什么?

html - 是否可以将类属性分配给标题?

javascript - amCharts:禁用图例中某些项目的切换

javascript - 在浏览器中寻找可自定义的语法突出显示

javascript - Google map API 找不到 $(document).ready 中定义的回调

html - 当浏览器小于最小宽度时,div 不会居中