javascript - react : How to manage state for multiple input types

标签 javascript node.js reactjs

正在开发一个在页面中显示网球运动员详细信息的 POC。可以显示“n”个运动员。用户可以同时更新所有玩家的信息。

编写了3个组件PlayersPage、PlayerTable和PlayerRow。当玩家信息在 PlayerRow 中更新时,我对如何更新 PlayersPage 中的状态(playerData)有点困惑。任何指针/链接都会有帮助。

下面是代码:

class PlayersPage extends React.Component {

    constructor(props) {
        super(props);
        this.state = {
            playerData: [
                {
                    "dataKey": "300",
                    "playerFirstName": "Roger",
                    "playerLastName": "Federer",
                    "playerRanking": "1"
                },
                {
                    "dataKey": "301",
                    "playerFirstName": "Rafael",
                    "playerLastName": "Nadal"
                    "playerRanking": "2"                    
                }           
            ]
        };
    }

    render() {
        return (
            <div className="container">
                <PlayerTable tableData={this.state.playerData} />;
            </div>
        );
    }
}



class PlayerTable extends React.Component {
    render() {
        const rows = [];
        this.props.tableData.forEach((rowData) => {
            rows.push(<PlayerRow key={rowData.dataKey} rowData={rowData} />);
        });
        return (
            <div className="table-responsive">
                <table className="table table-condensed">
                    <thead>
                        <tr>
                            <th>First Name</th>
                            <th>Last Name</th>
                            <th>Ranking</th>
                        </tr>
                    </thead>
                    <tbody>
                        {rows}
                    </tbody>
                </table>
            </div>
        );
    }
}

PlayerTable.propTypes = {
    tableData: PropTypes.array.isRequired
};



class PlayerRow extends React.Component {
    render() {
        return (
            <tr>
                <td><input type="text" value={this.props.rowData.playerFirstName} /></td>
                <td><input type="text" value={this.props.rowData.playerLastName} /></td>
                <td><input type="text" value={this.props.rowData.playerRanking} /></td>
            </tr>
        );
    }
}

PlayerRow.propTypes = {
    rowData: PropTypes.object.isRequired
};

最佳答案

class PlayersPage extends React.Component {
    constructor(props) {
        super(props);
        this.changeRecord = this.changeRecord.bind(this);
        this.state = {
            playerData: [
                {
                    "dataKey": "300",
                    "playerFirstName": "Roger",
                    "playerLastName": "Federer",
                    "playerRanking": "1"
                },
                {
                    "dataKey": "301",
                    "playerFirstName": "Rafael",
                    "playerLastName": "Nadal",
                    "playerRanking": "2"                    
                }           
            ]
        };
    }

    changeRecord(record, event) {
      console.log(event.currentTarget.value);
      console.log(record);
      this.setState({
        // Write your logic to update the playerDate value accordingly
      });
    }

    render() {
        return (
            <div className="container">
                <PlayerTable recordChangeHandler={this.changeRecord} tableData={this.state.playerData} />;
            </div>
        );
    }
}



class PlayerTable extends React.Component {
    render() {
        const rows = [];
        this.props.tableData.forEach((rowData) => {
            rows.push(<PlayerRow recordChangeHandler={this.props.recordChangeHandler} key={rowData.dataKey} rowData={rowData} />);
        });
        return (
            <div className="table-responsive">
                <table className="table table-condensed">
                    <thead>
                        <tr>
                            <th>First Name</th>
                            <th>Last Name</th>
                            <th>Ranking</th>
                        </tr>
                    </thead>
                    <tbody>
                        {rows}
                    </tbody>
                </table>
            </div>
        );
    }
}

class PlayerRow extends React.Component {
    render() {
        return (
            <tr>
                <td><input type="text" onChange={this.props.recordChangeHandler.bind(this, this.props.rowData)} defaultValue={this.props.rowData.playerFirstName} /></td>
                <td><input type="text" onChange={this.props.recordChangeHandler} defaultValue={this.props.rowData.playerLastName} /></td>
                <td><input type="text" onChange={this.props.recordChangeHandler} defaultValue={this.props.rowData.playerRanking} /></td>
            </tr>
        );
    }
}

ReactDOM.render(
  <PlayersPage />,
  document.getElementById('container')
);

查看您可以在 POC 应用程序中模拟的 JSFiddle 示例。 https://jsfiddle.net/69z2wepo/86736/

关于javascript - react : How to manage state for multiple input types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46531364/

相关文章:

javascript - 将 styled-jsx 与 postcss 一起使用,样式不会重新加载/重建

printing - 重新渲染 Reactjs 组件以进行打印

javascript - 使用聚合框架或 MapReduce 将事件数据中的文档嵌入到 MongoDB 中

javascript - 尝试使用字符串 : Uncaught TypeError: Object [object global] has no method 调用方法名称

javascript - 是否可以使用 findAll() 创建查询并使用数据透视表(多对多关系)中的 ForeignKey 获取过滤结果?

javascript - ts 无法通过 TypeScript 找到名称 'async'

javascript - 从 JSON 数据调用值时使用 fetch() 并获取 'Undefined'

angularjs - Angular未定义,引用错误?

javascript - 使用 .css 文件中的 CSS 属性的 JQuery 创建元素

reactjs - 如何在 react 组件中指定样式 block ?