查看表格以编辑Google Contacts中的电话号码。
假设我的状态如下:
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}}?
我在其他问题中看到了一些答案,但没有完成。
答案 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个选项
按照Paul Fitzgerald的建议,使电话组件具有其自身的状态。
将索引添加到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;
...
}