【问题标题】:React material ui table can't get element from row反应材料ui表无法从行中获取元素
【发布时间】:2016-04-15 20:39:43
【问题描述】:

我想使用材料 ui 库中的表格进行反应: http://www.material-ui.com/#/components/table

我显示它,它工作得很好,我正在尝试获取与我选择的行关联的对象,但我找不到这样做的方法,我看到了属性 childrenonRowSelection 但是我无法在这里获取我的对象是我的代码。 如何获取所选行的整个对象?

import React, { PropTypes, Component } from 'react'

import Table from 'material-ui/lib/table/table';
import TableHeaderColumn from 'material-ui/lib/table/table-header-column';
import TableRow from 'material-ui/lib/table/table-row';
import TableHeader from 'material-ui/lib/table/table-header';
import TableRowColumn from 'material-ui/lib/table/table-row-column';
import TableBody from 'material-ui/lib/table/table-body';


export default class MagicTableReact extends Component {
    constructor(props) {
        super(props);
        this.state = {
            data : [{id:0,name:"joe"},{id:1,name:"john"},{id:2,name:"Brad"},{id:3,name:"Jack"},{id:4,name:"Andrew"}],
            fixedHeader: true,
            fixedFooter: true,
            stripedRows: false,
            showRowHover: true,
            selectable: true,
            multiSelectable: false,
            enableSelectAll: false,
            deselectOnClickaway: true,
            height: '300px',
        };
    };


    _onRowSelection(e){
        console.log(e)

    }


    render() {

        return (

            <div>
                <div className="col-sm-6">
                    <h1>MagicTableReact</h1>
                    <Table
                        height={this.state.height}
                        fixedHeader={this.state.fixedHeader}
                        fixedFooter={this.state.fixedFooter}
                        selectable={this.state.selectable}
                        multiSelectable={this.state.multiSelectable}
                        >
                        <TableHeader>
                            <TableRow>
                                <TableHeaderColumn>ID</TableHeaderColumn>
                                <TableHeaderColumn>Name</TableHeaderColumn>
                            </TableRow>
                        </TableHeader>
                        <TableBody
                        >
                            {this.state.data.map((user, i) =>
                                <TableRow key={i}
                                    onRowSelection={this._onRowSelection.bind(this)}>
                                    <TableRowColumn>{user.id}</TableRowColumn>
                                    <TableRowColumn>{user.name}</TableRowColumn>
                                </TableRow>
                            )}
                        </TableBody>
                    </Table>
                </div>
            </div>
        )
    }
}

MagicTableReact.propTypes = {

};

【问题讨论】:

    标签: reactjs material-ui


    【解决方案1】:

    更新:在 material-ui 0.15.4 中,传递给 onRowSelection 处理程序的参数已更改。请参阅@Jonathn 的答案以了解未来的正确用法。

    onRowSelection&lt;Table&gt; 而不是 &lt;TableRow&gt; 的属性。此外,它不会在调用时使用事件调用处理程序 (e),而是使用键调用它。然后,您可以使用它来查找行。像这样:

    _onRowSelection(key) {
      console.log(key, this.state.data[key])
    },
    
    getInitialState() {
      return {
        data : [{id:0,name:"joe"},{id:1,name:"john"},{id:2,name:"Brad"},{id:3,name:"Jack"},{id:4,name:"Andrew"}],
        fixedHeader: true,
        fixedFooter: true,
        stripedRows: false,
        showRowHover: true,
        selectable: true,
        multiSelectable: false,
        enableSelectAll: false,
        deselectOnClickaway: true,
        height: '300px',
      };
    },
    
    render() {
      return (
        <div>
          <div className="col-sm-6">
            <h1>MagicTableReact</h1>
            <Table
              height={this.state.height}
              fixedHeader={this.state.fixedHeader}
              fixedFooter={this.state.fixedFooter}
              selectable={this.state.selectable}
              multiSelectable={this.state.multiSelectable}
              onRowSelection={this._onRowSelection}
            >
              <TableHeader>
                <TableRow>
                  <TableHeaderColumn>ID</TableHeaderColumn>
                  <TableHeaderColumn>Name</TableHeaderColumn>
                </TableRow>
              </TableHeader>
              <TableBody
              >
                {this.state.data.map((user, i) =>
                  <TableRow key={i} value={user}>
                    <TableRowColumn>{user.id}</TableRowColumn>
                    <TableRowColumn>{user.name}</TableRowColumn>
                  </TableRow>
                )}
              </TableBody>
            </Table>
          </div>
        </div>
      );
    }
    

    【讨论】:

    • 非常感谢您的回答是合乎逻辑的:)
    • 对我来说,当我将键设置为项目的 _id 时,它会作为行索引而不是键传递给 onRowSelection 处理程序。
    • 这可能是一个变化。以前从来没有意义。虽然参数 'key' 实际上是一个有趣的索引。
    【解决方案2】:

    使用 [Material-UI 0.15.4]

    onRowSelection 仅返回 noneall 或包含所选行的行号的数组。

    &lt;Table&gt; 级别使用onCellClick,返回rowNumbercolumnNumberevent。此事件包含target 下的表格单元格,您可以从那里引用data- 标记等。

    例子:

    function handleCellClick (rowNumber, columnNumber, evt) {
      console.log("activityId", evt.target.dataset.myRowIdentifier);
    }
    
    function createTableRow (content) {
      let activityId = content.shift();
      return (
        <TableRow key={activityId}>
          {content.map((columnContent, i) => {
            return (
              <TableRowColumn key={i} data-my-row-identifier={activityId} >{columnContent}</TableRowColumn>
            );
          })}
        </TableRow>
      );
    }
    
    return (
      <div>
        <Table onCellClick={handleCellClick}>
          <TableHeader displaySelectAll={false} adjustForCheckbox={false}>
          {createHeaderRow(tableHeader)}
          </TableHeader>
          <TableBody displayRowCheckbox={false}>
          {filteredTable.map(createTableRow)}
          </TableBody>
        </Table>
      </div>
    );
    

    我在 StackOverflow 上的第一个答案...希望对您有所帮助 :-)

    【讨论】:

    • 我无法让这个解决方案发挥作用。我尝试在 targetcurrentTarget 中访问数据属性,但它始终未定义。
    • 参见 Material UI 中的 this issue here。它解释了为什么这个答案在 Material-UI v0.16 中不再有效。听起来他们正在尝试解决这个问题。
    • 我刚试了一下,它适用于 0.20.0,所以他们可能已经修复了它。
    【解决方案3】:
    <Table onCellClick={(row, col, event) => console.log(event.target.innerHTML)}>
    

    【讨论】:

    • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
    【解决方案4】:

    您可以使用您的初始数据数组并根据行号引用索引来访问您选择的行以及与之关联的对象。这是一个基本示例,显然取决于您要对数据执行的操作,您可能需要添加更多逻辑。

    _onRowSelection(rows) {
        for (let i = 0; i < rows.length; i++) {
            console.log(this.state.data[rows[i]])
        }
    },
    
    getInitialState() {
      return {
        data : [{id:0,name:"joe"},{id:1,name:"john"},{id:2,name:"Brad"},{id:3,name:"Jack"},{id:4,name:"Andrew"}]
      };
    },
    
    render() {
      return (
        <div>
          <div className="col-sm-6">
            <h1>MagicTableReact</h1>
            <Table onRowSelection={(rows) => this._onRowSelection(rows)}>
              <TableHeader>
                <TableRow>
                  <TableHeaderColumn>ID</TableHeaderColumn>
                  <TableHeaderColumn>Name</TableHeaderColumn>
                </TableRow>
              </TableHeader>
              <TableBody
              >
                {this.state.data.map((user, i) =>
                  <TableRow key={i} value={user}>
                    <TableRowColumn>{user.id}</TableRowColumn>
                    <TableRowColumn>{user.name}</TableRowColumn>
                  </TableRow>
                )}
              </TableBody>
            </Table>
          </div>
        </div>
      );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-07
      • 2020-07-19
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 1970-01-01
      • 2022-06-30
      • 1970-01-01
      相关资源
      最近更新 更多