如何添加动态添加的字段的值

时间:2019-01-06 05:30:58

标签: javascript reactjs

我尝试在此处添加新字段,每次单击按钮“ +”都会添加字段输入。它工作正常,但我遇到的问题是我想添加这些输入字段的值。由于我是新来的反应者,所以我没有找到实现它的方法。有可能做到这一点。

class InputFields extends React.Component{
    render(){
    return (
        <div>
          <input name={`value[${this.props.index + 1}]`} onChange={this.onChangeValue} />
        </div>

        );
    }
}

class Main extends React.Component{
  constructor(props){
      super(props);

      this.values = props.value;

      this.state={
         inputs:[],
         values:[]
      };
      this.addInputs      = this.addInputs.bind(this);
  }

  addInputs() {
     const inputs = this.state.inputs.concat(InputFields);
     this.setState({ inputs });
  }

  onChangeValue(e){
   var value = e.target.value;
   this.value =value;
   this.addValues();
  }

  addValues(){
     ...
  }

  render () {
     const inputs = this.state.inputs.map((Element, index) => {
         return <Element key={ index } index={ index } />
     });

     return <div>
             <div>
              <input name={`value[${this.props.index}]`} onChange={this.onChangeValue} />
             </div>
             <div>
              <button className="btn btn-sm btn-primary" onClick={this.addInputs}>+</button>
             </div>
            </div>
  }
}

ReactDOM.render(
 <Main />,
 document.getElementById('calculator')
 );

2 个答案:

答案 0 :(得分:2)

不需要管理两个不同的变量来管理它,您可以在数组中循环并可以更改onChange事件的值

import React from "react";

export default class Example extends React.Component {
  state = {
    values: [null]
  };

  add() {
    this.setState(prevState => prevState.values.push(null));
  }
  changeVal(val, index) {
    this.setState(prevState => (prevState.values[index] = parseFloat(val)));
  }
  getSum() {
    let sum = 0;
    for (let i = 0; i < this.state.values.length; i++) {
      if (this.state.values[i] !== null) {
        sum += this.state.values[i];
      }
    }
    return sum;
  }

  render() {
    return (
      <div>
        {this.state.values.map((val, index) => (
          <div key={index}>
            <input
              onChange={e => this.changeVal(e.target.value, index)}
              type="number"
              value={val}
              placeholder="Enter a value"
            />
          </div>
        ))}
        <hr />
        Sum is {this.getSum()}
        <hr />
        <button onClick={this.add.bind(this)}> +Add</button>
      </div>
    );
  }
}

修改

添加了方法getSum()并将数字转换为changeVal()方法中的浮点数

Codesandbox链接-https://codesandbox.io/s/235o6xoxyr

答案 1 :(得分:1)

在react中,视图是数据的函数:UI = fn(data)

这意味着您将编写一个可以将数据转换为视图的组件树。 而且只能操作数据,这与您可能在jQuery中所熟悉的不同。

实际上,这意味着:

让一个组件Input处理一个输入的呈现:

const Input = ({value, onChange}) =>
  <input value={value} onChange={event => event.target.value} />

在您的状态下,仅将输入值列表保存为字符串。 React将在稍后将每个值转换为Input组件

this.state = {inputs: []}

编写一个负责向状态而不是视图添加新输入的函数

addInput = () => {
  this.setState({
    inputs: this.state.inputs.concat('')
  })
}

创建一种方法,用于更改列表中一个输入的值

changeValue = (i, newValue) => {
  this.setState({
    inputs: [
      ...this.state.inputs.slice(0, i),
      newValue,
      ...this.state.inputs.slice(i+1)]
  })
}

在Main的渲染方法中,遍历输入列表并转换为输入组件列表

this.state.inputs.map(
  (input, i) =>
    <Input
      key={i}
      value={input}
      onChange={newValue => this.changeValue(i, newValue)}
    />
)