【问题标题】:React js: setState for each cells in tableReact js:为表格中的每个单元格设置状态
【发布时间】:2020-12-08 11:32:48
【问题描述】:

因此,我尝试为表格单元格上的每次单击设置样式,当我单击其中一个单元格时,它会在第一次单击时突出显示该单元格,而在第二次单击时它将打开一个弹出窗口。我尝试使用 setstate 设置点击计数和类名,但它突出显示并将点击计数设置为 td 的整个列。到目前为止,这就是我得到的,只是一个 sn-p:

class tableView extends Component {

  constructor(props) {
    super(props);
    this.state = {
      data: [],
      countClicked: 0,
      selected: false
    };

handleClickOpen = (val) => {
  if (this.state.countClicked === 0) {
    this.setState({
      selected: true,
      countClicked: 1
    }))
  }
  if (this.state.countClicked === 1) {
    this.setState({
     selected: false
     countClicked: 0,
     setValueOfRow: val /*this is for pop ups*/
   }))


render(){
{data.map((c, i) => (
      <tr key={i}>
         <td className={this.state.selected ? "activeCell" : "default" }>
             <button onClick={() => {
                this.handleClickOpen(c.name);
              }}>
             {c.name ? `${c.name}` : " ? "}
             </button>
         </td>
         <td className={this.state.selected ? "activeCell" : 
          "default" }>
             <button onClick={() => {
                this.handleClickOpen(c.age);
              }}>
             {c.age ? `${c.age}` : " ? "}
             </button>
         </td>
       <td className={this.state.selected ? "activeCell" : 
          "default" }>
             <button onClick={() => {
                this.handleClickOpen(c.email);
              }}>
             {c.email ? `${c.email}` : " ? "}
             </button>
         </td>
      </tr>
}

【问题讨论】:

  • 如果您想要每个单元格的单独状态,您需要一个状态数组。单个变量显然不能存储多个单元格的状态。

标签: javascript reactjs html-table datatable setstate


【解决方案1】:

您可以将“选定”状态存储为一个布尔数组,每个布尔值代表每个单元格的选定状态:

constructor(props) {
    super(props);
    this.state = {
      selected: new Array(this.props.data.length).fill(false)
    };
}

您的数据数组也是空的,因此不会呈现任何单元格。我假设数据来自这里的道具。

然后在render()你可以使用:

render(){
{this.propes.data.map((c, i) => (
      <tr key={i}>
         <td className={this.state.selected[i] ? "activeCell" : "default" }>
             <button onClick={() => {
                this.handleClickOpen(i);
              }}>
             {c.name ? `${c.name}` : " ? "}
             </button>
         </td>
      </tr>
}

注意:将i 传递给handleClickOpen() 并使用this.state.selected[i] 切换类

然后在handleClickOpen():

handleClickOpen = (index) => {
   let newSelected = this.state.selected;
   newSelected[index] = !newSelected[index];
   this.setState({
      selected: newSelected
   });
}

【讨论】:

  • 谢谢!所选状态有效,但我如何使它在我单击单元格时其他列不受影响?
  • 不是检查this.state.selected 并基于此切换类,而是检查this.state.selected[i]
  • 抱歉,我的问题可能不清楚,我按照您的示例进行操作,除了单击“名称”列中的一个单元格时,其他列在同一索引中例如,具有相同切换功能的年龄、电子邮件等也突出显示了单元格。有没有办法阻止这种情况?
  • 哦,在这种情况下,您需要将selected 状态存储为二维数组。
  • 老实说,如果不知道您是如何实现 cols 的,就不可能给出更具体的答案。也许打开另一个问题会对您有更多帮助,因为您可以发布您的代码
猜你喜欢
  • 2016-05-04
  • 2011-10-22
  • 2014-05-25
  • 2011-04-22
  • 1970-01-01
  • 2021-11-29
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多