我有一个表格,提交时我想更新状态。目前,只有名字和姓氏有效。如何使用handleChange函数还可以更新嵌套对象的地址?还是我需要为此编写另一个函数? 感谢您的帮助
class Form extends Component {
constructor(props){
super(props);
this.state = {
name: '',
surname: '',
address: {
street: '',
city: '',
},
}
}
handleChange = e => {
this.setState({
[e.target.name]: e.target.value,
})
}
handleSubmit = e => {
e.preventDefault();
}
render() {
const {name, surname} = this.state;
const { street, city} = this.state.address;
return (
<form onSubmit={this.handleSubmit}>
<input type='text'
value={name}
name='name'
onChange={this.handleChange} />
<input type='text'
value={surname}
name='surname'
onChange={this.handleChange} />
<input type='text'
value={street}
name='street'
onChange={this.handleChange} />
<input type='text'
value={city}
name='city'
onChange={this.handleChange} />
<input type='submit' value='Submit' />
</form>
);
}
}
答案 0 :(得分:0)
您的表单元素中必须具有name
属性,然后检查该名称值是否为setState
。所以render()
方法看起来像这样
render() {
const {name, surname} = this.state;
const { street, city} = this.state.address;
return (
<form onSubmit={this.handleSubmit}>
<input type='text'
name={name}
value={name}
onChange={this.handleChange} />
<input type='text'
name={surname}
value={surname}
onChange={this.handleChange} />
<input type='text'
name={street}
value={street}
onChange={this.handleChange} />
<input type='text'
name={city}
value={city}
onChange={this.handleChange} />
<input type='submit' value='Submit' />
</form>
);
}
和handleChange()
handleChange = e => {
const name = e.target.name;
if (name === 'city' || name === 'street') {
this.setState({
address: {
...state.address,
[name]: e.target.value
}
});
} else {
this.setState({
[name]: e.target.value
});
}
};
...
是ES6 Spread Operator,这是在React中更新嵌套状态的最干净的方法。
答案 1 :(得分:0)
您只需要访问街道和城市?像这样先破坏地址即可。
更改
const {name, surname} = this.state;
const { street, city} = this.state.address;
到
const {name, surname, address } = this.state;
const { street, city} = address;
答案 2 :(得分:0)
我建议您为address
编写单独的变更处理程序。它将使您的代码简单易懂,而不是为此简单方法增加不必要的复杂性。
function handleAddressChange = e => {
const {name, value} = event.target
this.setState(({ address }) => {
address: {
...address,
[name]: value
}
})
}
答案 3 :(得分:0)
我知道你们所有人都面临着类似的任务,但重点是要重现原始状态。 React并不专注于处理嵌套状态。
this.state = {
name: '',
surname: '',
street: '',
city: ''
}