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

5
我已经尝试了以下代码来创建一个React表单,以动态生成输入字段逐个输入一系列人名。但是用户需要输入名字姓氏,而不仅仅是姓名。因此,表单需要生成一对动态输入字段。我是React的新手。有人能给出如何完成这个任务的提示吗?
注:以下代码摘自@Mayank Shukla在StackOverflow上的答案:How to implement a dynamic form with controlled components in React.JS?
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个回答

21

思路是,在状态变量中维护一个对象数组。每个对象将有两个键 firstNamesecondName(您可以添加更多字段)。将每个对象视为单个单元,并为所有键呈现输入元素,每当用户单击“添加更多”时,添加一个带有两个键的新对象/条目到数组中。

工作范例。

工作代码段:

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" />


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 库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接