如何在React.JS中实现带有受控组件的动态表单?

Mar*_*kov 21 javascript web-component reactjs

当我controlled form components 在react.js官方网站的参考文献中查看示例时,我想知道如何实现一个form你能够remove以及add input它们是受控组件的动态元素?这甚至可能吗?

在示例中我们可以看到:

class NameForm extends React.Component {
  constructor(props) {
    super(props);
    this.state = {value: ''};

    this.handleChange = this.handleChange.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
  }

  handleChange(event) {
    this.setState({value: event.target.value});
  }

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

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <label>
          Name:
          <input type="text" value={this.state.value} onChange={this.handleChange} />
        </label>
        <input type="submit" value="Submit" />
      </form>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

由于我的工作性质,我经常发现自己必须实施这些形式.此外,我没有add或remove input直接元素 - 我正在管理自定义组件,但为了简单起见,我要求基本的表单元素.

May*_*kla 38

如何动态添加/删除输入元素?

是的,有可能,你可以添加/删除input元素dynamically,但为此你需要处理一些事情:

1-正确绑定事件.

2- Array用于分别存储每个输入元素的值.

3-当用户在任何输入元素中填充值时,只更新状态中的特定值.

逻辑:

维护一个内部状态的数组,它将存储值.使用#array.map为每个数组值创建ui(输入元素).在创建字段时,button对每个字段使用remove ,并传递字段索引function,它将帮助您识别要删除的字段,也可以执行相同的操作onChange.

检查此示例:

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'));
Run Code Online (Sandbox Code Playgroud)
<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'/>
Run Code Online (Sandbox Code Playgroud)

检查工作jsfiddle:https://jsfiddle.net/mayankshukla5031/ezdxg224/


yur*_*uri 9

如何使用功能组件动态添加/删除输入元素?

所选答案中的相同组件被审查并重写为功能组件。

import React from 'react';
import { useState } from 'react';

function DynamicInput() {

    const [values, setValues] = useState({ val: []});

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

    function handleChange(event) {
      let vals = [...values.val];
      vals[this] = event.target.value;
      setValues({ val: vals });
    }

    const addClick = () => {
      setValues({ val: [...values.val, '']})
    }

    const removeClick = () => {
      let vals = [...values.val];
      vals.splice(this,1);
      setValues({ val: vals });
    }

    const handleSubmit = event => {
      alert('A name was submitted: ' + values.val.join(', '));
      event.preventDefault();
    }

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

}

export default DynamicInput;

Run Code Online (Sandbox Code Playgroud)