如何使用e.target.value
访问和设置班级的动态setState
?
我尝试过this.setState({fields[e.target.name]: e.target.value});
class App extends Component {
constructor() {
super();
this.state = {
data: [],
fields: {
name: ''
}
}
}
handleChange = e => this.setState({fields[e.target.name]: e.target.value});
render() {
const { fields } = this.state;
return (
<>
<input type="text" name="name" placeholder="name" onChange={this.handleChange} value={fields.name} />
</>
)
}
}
export default App;
答案 0 :(得分:3)
您无法访问这样的状态属性。一种可能的解决方案是从fields
创建一个副本,修改值,然后设置新状态,如下所示:
handleChange = e => {
// The line below creates a copy of the state, using the spread operator
let fields = { ...this.state.fields };
fields[e.target.name] = e.target.value
this.setState({fields});
}
答案 1 :(得分:3)
这与question有点类似。有两种更新对象的方法。正如其他人所说,这样的嵌套状态是一种反模式。 This是为什么的很好的读物。
1-最简单的一个:
首先创建fields
的副本,然后执行以下更改:
let fields = Object.assign({}, this.state.fields); //creating copy of object
fields[e.target.name] = e.target.value //updating value
this.setState({fields});
我们也可以这样写,而不是使用Object.assign
:
let fields = {...this.state.fields};
2-使用spread operator :
handleChange = e => {
e.persist(); //need to make the values persist because of event pooling
this.setState(prevState => ({
...prevState,
fields: {
[e.target.name]: e.target.value
}
}))
}