【问题标题】:react table row show column on button click在按钮单击时反应表格行显示列
【发布时间】:2018-01-31 18:34:38
【问题描述】:

我有一个通过映射数组来动态构建的表。数组中的每个项目都有一行。每行中的一列是select。我只希望在单击同一行的下一列中的按钮时显示该列的内容。

我的计划是为数组中的每个对象添加某种切换布尔属性,但是当我尝试在按钮的 onclick 中切换它时,我的 eslint 抱怨,因为我正在尝试修改我将参数发送到 onclick 调用的函数中。

这样做的适当方法是什么?

这是表格的代码:

<table>
  <tbody>
    {myArray.map(row => (
      <tr key={`test-${row.name}`}>
        <td>
          <div className="testClass">{row.id}</div>
        </td>
        <td>{row.name}</td>
        <td>
          <Select
            options={this.getOptions(row.id)}
            onSelect={this.onOptionSelect}
            placeholder="Select something"
          />
        </td>
        <td><button onClick={() => { changeStuff(row); }}>{ row.myToggle ? 'Save' : 'Change something' }</button></td>
      </tr>
    ))}
  </tbody>
</table>

【问题讨论】:

  • 你能准确更新eslint错误吗?
  • 你能分享一些代码吗?您可能需要通过状态标志处理列的显示
  • 每一行都必须有状态才能做州旗,不是吗?此时,行没有状态。我不想显示所有行的下拉列表,只显示单击按钮的行。
  • @Firice - "分配给函数参数'row'的属性。(no-param-reaassign)"
  • @BenWalker。我已经发布了答案。看看!!

标签: reactjs


【解决方案1】:

在点击处理程序中,您可以完全更新数组以显示/隐藏选择选项。

根据我的理解,我尝试在 sn-p 下创建。根据我的理解,这是我能想到的方法。我在对象数组中维护了“隐藏”字段。我使用了一个简单的按钮,而不是“选择”。您可以进行相应的更改。希望这会有所帮助。

const list = [
  {
    name: "Person 1",
    phone: "123-4567",
    id: 11,
    hidden:true
  },
  {
    name: "Person 2",
    phone: "123-4567",
    id: 12,
    hidden:true
  },
  {
    name: "Person 3",
    phone: "123-4567",
    id: 23,
    hidden:true
  },
  {
    name: "Person 4",
    phone: "123-4567",
    id: 34,
    hidden:true
  },
  {
    name: "Person 5",
    phone: "123-4567",
    id: 45,
    hidden:true
  }
];

class App extends React.Component {
  constructor(props) {
    super(props);

    this.state = {
      list: list
    };
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick(item) {
    let updatedList = this.state.list.map(obj => {
       if(obj.id === item.id) {
         return Object.assign({}, obj, {
            hidden:!item.hidden
         });
       }
       return obj;
    });
    this.setState({
      list : updatedList
    });
  }

  render() {
    return (
      <div>
        <table>
          <tbody>
            {this.state.list.map(item =>
              <tr key={item.itemId}>
                <td>
                  {item.name}
                </td>
                <td>
                  {item.phone}
                </td>
                <td >
                  <button hidden={item.hidden}> Action </button>
                </td>
                <td>
                  <button
                    className="delete"
                    onClick={() => this.handleClick(item)}
                  >
                    Change
                  </button>
                </td>
              </tr>
            )}
          </tbody>
        </table>
      </div>
    );
  }
}
ReactDOM.render(<App />, document.getElementById("app"));
table td {
     font-size: 14px;
     font-weight: normal;
     padding: 10px;
     border: 1px solid #eee;
 }
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<div id="app"></div>

【讨论】:

  • 仍在努力实施。到目前为止,它看起来不错。只是想确保在接受答案之前我已经完成了所有工作。
猜你喜欢
  • 1970-01-01
  • 2013-11-21
  • 2017-09-21
  • 2013-12-06
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多