反应输入setState的对象数组

时间:2018-07-05 14:21:20

标签: javascript reactjs forms

查看表格以编辑Google Contacts中的电话号码。

enter image description here

假设我的状态如下:

    this.state = {
        phones: [
            {
                country: 'US',
                label: 'Home',
                number: '555'
            }
        ],

    };

我的HTML看起来像一个循环,简化为所有文本输入:

<input type="text" value={this.state.phones[index].country} onChange={this.handleChange} />
<input type="text" value={this.state.phones[index].number} onChange={this.handleChange} />
<input type="text" value={this.state.phones[index].label} onChange={this.handleChange} />

在支持handleChange是数组并且数组中的每个项目都具有多个属性这一事实的同时,如何实现setState来调用{{1}}?

我在其他问题中看到了一些答案,但没有完成。

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作,并制作一个Phone组件。

class Phone extends React.Component {

  render() {
    return (
      <div className="App">
        <p>{this.props.label}</p>
        <input
          type="number"
          onChange={this.props.updateNumber}
          value={this.props.number}
        />
      </div>
    );
  }
}

class App extends React.Component {
  state = {
    phones: [
      {
        name: "US",
        number: ""
      },
      {
        name: "UK",
        number: ""
      }
    ]
  };

  updateNumber = (e, index) => {
    const phones = this.state.phones;
    phones[index].number = e.target.value;
    this.setState({
      phones
    });
  };

  render() {
    return (
      <div className="App">
        {this.state.phones.map((phone, i) => {
          return (
            <Phone
              updateNumber={e => {
                this.updateNumber(e, i);
              }}
              number={this.state.phones[i].number}
              label={phone.name}
            />
          );
        })}
      </div>
    );
  }
}

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

答案 1 :(得分:0)

2个选项

  1. 按照Paul Fitzgerald的建议,使电话组件具有其自身的状态。

  2. 将索引添加到data-index属性中,并检查handleChange中的值。

示例2:

<input type="text" value={this.state.phones[index].country} data-index="0" onChange={this.handleChange} />
<input type="text" value={this.state.phones[index].number} data-index="0" onChange={this.handleChange} />
<input type="text" value={this.state.phones[index].label} data-index="0" onChange={this.handleChange} />

然后在handleChange

handleChange(e) {
    ...
    const i = e.target.dataset.index;
    ...
}