如何使用reactjs动态生成一对输入字段

时间:2018-07-21 16:04:19

标签: reactjs

我已经尝试了以下代码来创建反应表单,以动态生成输入字段,以一个人一个个地输入人的名字。但是用户需要输入first namelast name而不是仅输入name。因此,表单需要生成一对动态输入字段。我是react的新手。任何人都可以提示如何完成此操作。

注意:以下代码摘自@Mayank Shukla在How to implement a dynamic form with controlled components in React.JS?的stackoverflow答案。

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = { values: [] };
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  createUI(){
     return this.state.values.map((el, i) => 
         <div key={i}>
            <input type="text" value={el||''} onChange={this.handleChange.bind(this, i)} />
            <input type='button' value='remove' onClick={this.removeClick.bind(this, i)}/>
         </div>          
     )
  }

  handleChange(i, event) {
     let values = [...this.state.values];
     values[i] = event.target.value;
     this.setState({ values });
  }

  addClick(){
    this.setState(prevState => ({ values: [...prevState.values, '']}))
  }

  removeClick(i){
     let values = [...this.state.values];
     values.splice(i,1);
     this.setState({ values });
  }

  handleSubmit(event) {
    alert('A name was submitted: ' + this.state.values.join(', '));
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
          {this.createUI()}        
          <input type='button' value='add more' onClick={this.addClick.bind(this)}/>
          <input type="submit" value="Submit" />
      </form>
    );
  }
}

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

2 个答案:

答案 0 :(得分:6)

想法是,在状态变量中维护对象数组。每个对象将具有两个键firstNamesecondName(您可以添加更多字段)。将每个对象视为一个单元,并为所有键渲染输入元素,每当用户单击“添加更多”时,添加一个对象/用两个键进入数组。

Working Fiddle.

工作片段:

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
    	users: [{firstName: "", lastName: ""}]
    };
    this.handleSubmit = this.handleSubmit.bind(this);
  }
  
  addClick(){
    this.setState(prevState => ({ 
    	users: [...prevState.users, { firstName: "", lastName: "" }]
    }))
  }
  
  createUI(){
     return this.state.users.map((el, i) => (
       <div key={i}>
    	  <input placeholder="First Name" name="firstName" value={el.firstName ||''} onChange={this.handleChange.bind(this, i)} />
          <input placeholder="Last Name" name="lastName" value={el.lastName ||''} onChange={this.handleChange.bind(this, i)} />
    	  <input type='button' value='remove' onClick={this.removeClick.bind(this, i)}/>
       </div>          
     ))
  }
  
  handleChange(i, e) {
     const { name, value } = e.target;
     let users = [...this.state.users];
     users[i] = {...users[i], [name]: value};
     this.setState({ users });
  }
  
  removeClick(i){
     let users = [...this.state.users];
     users.splice(i, 1);
     this.setState({ users });
  }
  
  handleSubmit(event) {
    alert('A name was submitted: ' + JSON.stringify(this.state.users));
    event.preventDefault();
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
          {this.createUI()}        
          <input type='button' value='add more' onClick={this.addClick.bind(this)}/>
          <input type="submit" value="Submit" />
      </form>
    );
  }
}

ReactDOM.render(<App />, document.getElementById('container'));
<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="container" />

答案 1 :(得分:0)

尝试一下

state = {
    number: [""],
    dataArr: []
}

render() {
    return (
        <div>
            <div onClick={()=>this.setState(prevState => ({number: [...prevState.number, ""]}))}>Add More element</div>
            {this.state.number.map((e, i)=> {
                return (
                    <input value={this.state.number[i]} onChange={(data) => this.setState({dataArr: update(this.state.dataArr, {i: {$set: data}})})} />
                )
            })}
        </div>
    )
}

您将必须处理this.state.dataArr中的数据。例如,this.state.dataAtt[0]将在用户按下“添加更多元素”按钮之前在输入字段中包含起始值,然后当用户再次按下同一按钮时,数据将被添加到this.state.dataArr[1]中,依此类推。

您将需要react-addons-update库。