如何在 React 中取消单击表格单元格

Posted

技术标签:

【中文标题】如何在 React 中取消单击表格单元格【英文标题】:How to Unclick a Table Cell in React 【发布时间】:2020-12-08 06:53:39 【问题描述】:

我有一个用 React 构建的表。如果我点击一个单元格,我希望能够为它着色,如果我点击另一个单元格,我希望它能够取消着色(新的单元格会被着色)。

当我单击单元格时,我可以成功地为它们着色,但我不确定如何取消它们的颜色,因为单元格对象不知道何时单击了不同的单元格。 (不过,我想不出行/表格对象中的任何内容。)因此,如果我多次单击,我最终会得到一堆彩色单元格,而不是一个。

这是我的手机密码:

class Cell extends React.Component 

    state = 
        bgColor: 'inherit'
      

    handleClick = (columnId) => 
        this.setState(
            bgColor: "blue"
        )
    

    render() 

        const content = this.props.content;

        return (
            <td
                onClick=()=> this.handleClick()
                style=backgroundColor: this.state.bgColor
            >
                content
            </td>
        )
    

提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

当我单击单元格时,我可以成功地为单元格着色,但我不确定 如何使它们脱色,因为单元格对象不知道何时 点击了不同的单元格

您需要一个单一的事实来源,以便您的组件知道谁是活跃的。在下面的示例中,我将activeCell 状态放在父组件App 上,这样它就可以保存谁处于活动状态的真实值。根据需要将道具传递给Cell,以便在点击时更新新的activeCell

class Cell extends React.Component 
  render() 

    const content = this.props.content;

    return (
      <td
          onClick=()=>this.props.handleChangeActiveCell(this.props.identifier)
          style=backgroundColor: this.props.activeCell === true ? this.props.bgColor : 'inherit'
      >
          content
      </td>
    )
  


class App extends React.Component 

  state = 
    bgColor: "blue",
    activeCell: -1
  
  
  handleChangeActiveCell = (key) => 
    this.setState(
      activeCell: key
    );
  

  render()
    return(
      <React.Fragment>
        <table>
          <tr>
            <Cell 
              identifier=0 
              handleChangeActiveCell=this.handleChangeActiveCell 
              activeCell=this.state.activeCell === 0 ? true : false 
              bgColor=this.state.bgColor 
              content=`sample_content`
            />
            
            <Cell 
              identifier=1 
              handleChangeActiveCell=this.handleChangeActiveCell 
              activeCell=this.state.activeCell === 1 ? true : false 
              bgColor=this.state.bgColor 
              content=`sample_content`
            />
          </tr>
        </table>
      </React.Fragment>
    );
  


ReactDOM.render(<App/>, document.getElementById("root"));
td 
  cursor: pointer;
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.0/umd/react-dom.production.min.js"></script>
<div id="root"></div>

【讨论】:

谢谢,这很有意义! 不客气。这将是您的应用程序向前发展的常见做法。请记住,如果组件 A 和组件 B 需要知道彼此的状态,您可以让 它们的父组件保持该状态并将状态作为 props 传递给两个组件,然后执行一些逻辑。如果该“状态”需要在整个应用程序中持续存在,您可以考虑使用 React Context。 是的,您的回答为我澄清了很多做法。 :)

以上是关于如何在 React 中取消单击表格单元格的主要内容,如果未能解决你的问题,请参考以下文章

单击离开时取消选择表格单元格。迅速

表格里下划线怎么去掉

React - 在表格的单元格中切换输入

单击表格单元格内的按钮时无法更新状态,React Ant Design

如何在表格视图中显示表格单元格的详细视图?

如何在单击时更改 HTML 表格单元格颜色