我是ReactJ的新手,所以我试图从POST剩余api编辑post
记录。
我的post
对象看起来像这样。
响应数据
post: {
title: 'the title',
body: 'the body'
}
EditPost.js
state = {
post: {
title: '',
body: ''
}
}
componentDidMount() {
const { id } = this.props.match.params;
jsonPlaceholder.get(`/posts/${id}`).then(res => {
this.setState({ post: res.data })
console.log(this.state.post)
})
}
handleChange = e => {
this.setState({ [e.target.name]: e.target.value });
}
我像这样绑定它并分配onChange
<input type="text" name="title" placeholder="This is the title" value={this.state.post.title} onChange={this.handleChange.bind(this)} />
<textarea value={this.state.post.body} name="body" onChange={this.handleChange.bind(this)} ></textarea>
我的问题是这不是从状态更新帖子,而是创建新状态。
示例:
从state = { post: {} }
到state = { post: {}, title: '', body: ''}
答案 0 :(得分:3)
您没有正确访问post
,spread
原始对象并更改了所需的property
handleChange = e => {
this.setState(prevState =>({
post:{
...prevState.post,
[e.target.name]: e.target.value
}
}));
}
请注意,我正在使用updater
的{{1}}版本。使用setState
比实际使用snapshot
更安全,因为您无法保证...this.state
不会在其他地方发生变化。
答案 1 :(得分:1)
您应该在方法中添加“ post”属性。
赞:
this.setState({ post: { ...this.state.post, [e.target.name]: e.target.value } });
但我不建议您对此使用嵌套道具。