【问题标题】:ReactJS - Setting row dropdown in a tableReactJS - 在表格中设置行下拉列表
【发布时间】:2017-01-29 13:48:30
【问题描述】:

我正在使用材质 ui 表。其中一列有 SelectField 组件,它是一个下拉菜单,可供选择的项目很少。示例代码:

<TableBody
        displayRowCheckbox={this.state.showCheckboxes}
        deselectOnClickaway={this.state.deselectOnClickaway}
        showRowHover={this.state.showRowHover}
        stripedRows={this.state.stripedRows}
      >
        {tableData.map( (row, index) => (
          <TableRow key={index} selected={row.selected}>
            <TableRowColumn>{index}</TableRowColumn>
            <TableRowColumn>
                <SelectField key={index} value={row.clientId} onChange={this.handleRowChange}>
                {clientsDropdownData.map((row, index) =>(
                    <MenuItem key={row.val} value={row.val} primaryText={row.name} />

                ))}
                </SelectField>
            </TableRowColumn>
            <TableRowColumn>{row.name}</TableRowColumn>
            <TableRowColumn>{row.status}</TableRowColumn>
          </TableRow>
          ))}
      </TableBody>

所有行的下拉列表的初始值都根据提供给表的数据中的 clientId 值正确设置。在更改所选行的下拉列表时,我想更改提供的数据的 clientId 属性。我怎样才能实现它? React 是关于状态的。但是如何管理多个动态状态?

这就是我对 SelectField 的 onChange 所拥有的:

handleRowChange = (event, index, rowValue) => {
      //this.setState({rowValue}); how to set state here?
      tableData[index]['clientId'] = rowValue; //this doesn't work. But this is what I want. I want to update tableData and also update the UI.
  }

【问题讨论】:

  • “tableData”是您所在州的一部分吗?您使用的是 Flux 还是其他模式?请提供更多信息。
  • 'tableData' 只是同一个 jsx 文件上的一个常量。 const tableData = [ { name: 'John Smith', status: 'Employed', clientId: 1, selected: true, }, { name: 'Randal White', clientId: 2, status: 'Unemployed', }, ...... .... const clientsDropdownData = [{ val: 1,name: 'Abott'}, { val: 2, name: 'MSD' }, ..我没有使用助焊剂。它只是反应和材料-ui。 material-ui.com/#/components/table

标签: reactjs dropdown material-ui


【解决方案1】:

您可以在您所在的州使用属性tableData。当您想要更新它(表格数据和表格视图)时,您可以只需更改状态中的表格数据:

handleRowChange = (event, index, rowValue) => {
      let newTableData = this.state.tableData
      newTableData[index]['clientId'] = rowValue;
      this.setState({tableData: newTableData}); //New table set and view updated
  }

并直接使用您所在州的表格替换:

{tableData.map( (row, index) => (

与

{this.state.tableData.map( (row, index) => (

这就是为什么 React 的状态实际上是无用的。你可以放任何你想要的东西,当你更新它时,视图将被重新渲染。如果您的状态变得更复杂,您可以使用 Redux

等替代方法

【讨论】:

  • 好的。我已将数据移至状态。 handleRowChange 现在看起来更合乎逻辑了。但我还是有问题。 handleRowChange 中的索引是 SelectField 的选定项的索引,而不是 Table 的选定行索引。因此,我使用了表 onTableRowSelection 的另一种方法,并设置了另一个名为 selectedTableIndex 的状态。现在效果很好!谢谢 :) 我不熟悉 React。但我有个问题。如果我们有成百上千的行,而当我们只更改一行时,更新整个表的数据是否有意义?不影响性能吗?
  • 我不太了解 React/Redux 状态下的大对象的性能问题,因为幸运的是我自己还没有处理过这些问题。但是有很多关于该主题及其与不变性的关系的文章。 React 提供了一个immutability helper。如果你担心重新渲染,React 不会只是在从一种状态转换到另一种状态时更改 HTML,it finds the difference between them 并相应地更新。
猜你喜欢
  • 2010-11-04
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多