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

标签 reactjs

我尝试使用以下代码创建一个 react 表单来动态生成输入字段以逐一输入一系列人名。但用户需要输入名字姓氏,而不仅仅是名字。因此,表单需要生成一对动态输入字段。我是 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'));

最佳答案

想法是,在状态变量中维护一个对象数组。每个对象都有两个键 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" />

关于reactjs - 如何使用reactjs动态生成一对输入字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51457843/

相关文章:

javascript - Mobx 不观察可观察数组中的类

javascript - 重新渲染时组件崩溃 | react 、Redux

reactjs - 如何模拟 Material-ui withStyles 的实现?

arrays - 更新 redux 数组中的多个项目

javascript - React-redux 持续存在,仅重新水合处于 redux 状态的某些节点

javascript - 我应该在 ReactJS 页面中使用函数而不是类吗?

javascript - map 框 gl 与 React js 的错误行为

javascript - ReactJS(初学者)使用 Youtube API - 返回的对象不允许我访问 VideoId 属性

javascript - 在组件中读取文本输入引用时,React Native refs 未定义

javascript - 如何在 ReactJS 中用另一个字符串和不同的颜色替换一个字符串?