【问题标题】:how to dynamically add rows to table on pressing submit on form如何在表单上按下提交时动态地将行添加到表中
【发布时间】:2017-06-23 07:15:48
【问题描述】:

我需要帮助创建当用户按下提交按钮时自动添加行的部分。现在有 4 个字段和一个提交按钮。在其下方有一个显示所有数据的表格。因此,当有人在文本字段中输入数据并按下提交时,它应该将该数据存储到“genData”中,之后,它应该在表中创建一个新行,人们应该能够看到它应该在下面的新数据已显示的当前数据。

const genData = [
{ firstName: "foo", lastName: "boo", type: "male", email: "fooboo@gmail.com"}

];

class Stepper extends React.Component {
render() {
return (
  <div>
    <TextField
      hintText="First Name"
    />
    <TextField
      hintText="Last Name"
    />
    <TextField
      hintText="Type"
    />
    <TextField
      hintText="Email"
    />
    <RaisedButton label="Submit" primary={true}/>

    <Table>
<TableHeader>
  <TableRow>
    <TableHeaderColumn>First Name</TableHeaderColumn>
    <TableHeaderColumn>Last Name</TableHeaderColumn>
    <TableHeaderColumn>Type</TableHeaderColumn>
    <TableHeaderColumn>Email</TableHeaderColumn>
  </TableRow>
</TableHeader>
<TableBody>
  {genData.map( (row) => (
  <TableRow>
    <TableRowColumn>{row.firstName}</TableRowColumn>
    <TableRowColumn>{row.lastName}</TableRowColumn>
    <TableRowColumn>{row.type}</TableRowColumn>
    <TableRowColumn>{row.email}</TableRowColumn>
  </TableRow>
  ))}
</TableBody>
</Table>

  </div>
);
}
 }

【问题讨论】:

  • 我建议您阅读任何(来自许多)待办事项示例以进行反应,因为它们都有您感兴趣的功能。

标签: javascript node.js reactjs


【解决方案1】:

变化:

1.将数据存储在Stepper的状态中,这样每当您添加新条目时,它都会自动重新渲染表格。

2. 使用RaisedButton 按钮定义一个onTouchTap 事件,然后单击该按钮将新数据推送到状态变量中。

3. 要么你必须使用ref 作为uncontrolled component 要么为每个输入字段定义一个state 变量,以在提交函数中获取输入字段值。

4.循环创建时为每个元素分配唯一键。

完整代码:

class Stepper extends React.Component {

  constructor(){
    super();
    this.state = {
      genData : [
          {
            firstName: "foo", 
            lastName: "boo", 
            type: "male", 
            email: "fooboo@gmail.com"
          }
      ]
    }
    this._handleSubmit = this._handleSubmit.bind(this);
  }

  _handleSubmit(){
    let genData = this.state.genData.slice();
    genData.push({
      firstName: this.fName.props.value, 
      lastName: this.lName.props.value, 
      type: this.type.props.value, 
      email: this.email.props.value
    });
    this.setState({ genData })
  }

  render() {
    return (
      <div>
        <TextField
          ref={el => this.fName = el}
          hintText="First Name"
        />
        <TextField
          ref={el => this.lName = el}
          hintText="Last Name"
        />
        <TextField
          ref={el => this.type = el}
          hintText="Type"
        />
        <TextField
          ref={el => this.email = el}
          hintText="Email"
        />
        <RaisedButton onTouchTap={this._handleSubmit} label="Submit" primary={true}/>

        <Table>
          <TableHeader>
            <TableRow>
              <TableHeaderColumn>First Name</TableHeaderColumn>
              <TableHeaderColumn>Last Name</TableHeaderColumn>
              <TableHeaderColumn>Type</TableHeaderColumn>
              <TableHeaderColumn>Email</TableHeaderColumn>
            </TableRow>
          </TableHeader>
          <TableBody>
            {this.state.genData.map( (row, i) => (
              <TableRow key={i}>
                <TableRowColumn>{row.firstName}</TableRowColumn>
                <TableRowColumn>{row.lastName}</TableRowColumn>
                <TableRowColumn>{row.type}</TableRowColumn>
                <TableRowColumn>{row.email}</TableRowColumn>
              </TableRow>
            ))}
          </TableBody>
        </Table>
      </div>
    );
  }
}

更新:

将此代码用于受控组件:

class Stepper extends React.Component {

  constructor(){
    super();
    this.state = {
      fName: '',
      lName: '',
      type: '',
      email: '',
      genData : [
          {
            firstName: "foo", 
            lastName: "boo", 
            type: "male", 
            email: "fooboo@gmail.com"
          }
      ]
    }
    this._handleSubmit = this._handleSubmit.bind(this);
  }

  _handleSubmit(){
    let genData = this.state.genData.slice();
    genData.push({
      firstName: this.state.fName, 
      lastName: this.state.lName, 
      type: this.state.type,
      email: this.state.email
    });
    this.setState({ 
      genData,
      fName: '',
      lName: '',
      type: '',
      email: '' 
    })
  }

  onChange(fieldName, value){
    this.setState({
      [fieldName]: value
    });
  }

  render() {
    return (
      <div>
        <TextField
          value={this.state.fName}
          onChange={(e,value) => this.onChange('fName', value)}
          hintText="First Name"
        />
        <TextField
          value={this.state.lName}
          onChange={(e,value) => this.onChange('lName', value)}
          hintText="Last Name"
        />
        <TextField
          value={this.state.type}
          onChange={(e,value) => this.onChange('type', value)}
          hintText="Type"
        />
        <TextField
          value={this.state.email}
          onChange={(e,value) => this.onChange('email', value)}
          hintText="Email"
        />
        <RaisedButton onTouchTap={this._handleSubmit} label="Submit" primary={true}/>

        <Table>
          <TableHeader>
            <TableRow>
              <TableHeaderColumn>First Name</TableHeaderColumn>
              <TableHeaderColumn>Last Name</TableHeaderColumn>
              <TableHeaderColumn>Type</TableHeaderColumn>
              <TableHeaderColumn>Email</TableHeaderColumn>
            </TableRow>
          </TableHeader>
          <TableBody>
            {this.state.genData.map( (row, i) => (
              <TableRow key={i}>
                <TableRowColumn>{row.firstName}</TableRowColumn>
                <TableRowColumn>{row.lastName}</TableRowColumn>
                <TableRowColumn>{row.type}</TableRowColumn>
                <TableRowColumn>{row.email}</TableRowColumn>
              </TableRow>
            ))}
          </TableBody>
        </Table>
      </div>
    );
  }
}

【讨论】:

  • 当我按下提交时,它不会重新渲染和更新表格。它什么也没做
  • @JohnBerry 抱歉,handlesubmit 函数中有错字:let genData = this.state.slice(); 特别检查更新的代码handlesubmit 函数使用此行:let genData = this.state.genData.slice(); 它会起作用。
  • 修复了错误,但问题是它在表格中创建了一个空白行,它不会从字段中获取数据并将其放入表格行中
  • console.log(this.fName.value, this.lName.value, this.type.value) 放入handleSubmit 函数并让我知道输出。
  • 还是空白
【解决方案2】:

您需要在按钮上设置事件侦听器/处理程序,以便在单击时执行某些操作。在 React 组件中,您通常通过 onClick 属性传递函数以进行调用,但这取决于组件。

<RaisedButton label="Submit" primary={true} onClick={(e) => doSomething(); } />

&lt;RaisedButton /&gt; 也有一个用于触摸输入的onTouchTap 属性,您可能需要检查一下(文档here

要获取新数据,您需要获取所有&lt;TextField /&gt; 组件的值并将它们推送到genData 数组中。我还建议将此数组作为内部 state 并使用 this.setState() 对其进行更新。

【讨论】:

    猜你喜欢
    • 2015-07-29
    • 2018-09-05
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2015-10-29
    • 2021-10-07
    相关资源
    最近更新 更多