Javascript 意外的反应组件状态值更改
我试图更新Javascript 意外的反应组件状态值更改,javascript,reactjs,Javascript,Reactjs,我试图更新状态值,但首先我已将其加载到另一个变量中,在对新的变量进行更改后,它将进入设置状态并更新原始的状态值。但是对临时var所做的意外更改已经更改了组件的状态值 var postData = this.state.postData; postData.likes = postData.likes + 1; console.log(postData.likes, this.state.postData.likes); console.log值: (1, 1) (2, 2) …因为postDa
状态
值,但首先我已将其加载到另一个变量
中,在对新的变量
进行更改后,它将进入设置状态
并更新原始的状态
值。但是对临时var
所做的意外更改已经更改了组件的状态
值
var postData = this.state.postData;
postData.likes = postData.likes + 1;
console.log(postData.likes, this.state.postData.likes);
console.log
值:
(1, 1)
(2, 2)
…因为postData
是一个对象,所以不要将它直接保存在另一个变量中,因为这将创建对处于该状态的变量的引用,而不是副本。如果它是一个引用,改变一个会改变另一个,因为它们都指向同一个对象
先复印一份。”
然后更改它。完成后,使用setState({postData})
因为postData
是一个对象,所以不要将它直接保存在另一个变量中,因为这将创建对处于状态的变量的引用,而不是副本。如果它是引用,更改一个将更改另一个,因为它们都指向同一个对象
先复印一份。”
然后改变它。完成后,使用setState({postData})
您还可以使用ES2018扩展表示法,如var postData={…this.state.postData}
克隆对象并在分配回状态之前对其进行操作。您还可以使用ES2018扩展表示法,如var postData={…this.state.postData}
克隆对象并在将其分配回状态之前对其进行操作。您永远不应改变状态,始终使用setState,并用于复制对象用户排列符号“…”
您永远不应该改变状态,始终使用setState,并用于复制对象用户排列符号“…”
这是一种不正确的更新状态的方法,因为它经常会导致意外行为。@AnhPham以及如何做到这一点?请参阅此处的文档,我明白您的意思,但除非您无意中从多个位置更新状态,否则它应该是好的,但可以为您修复;-)但你仍然不应该这样做这是一种不正确的状态更新方式,因为它经常会导致意外行为。@AnhPham以及如何做到这一点?现在参考这里的文档,我明白你的意思,但除非你在多个地方无意识地更新状态,否则它应该是好的,但可以为你修复;-)但是你还是不应该那样做是的,实际上这个也行。谢谢你的评论。是的,实际上这个也很有效。谢谢你的评论。
var postData = Object.assign({}, this.state.postData)
this.setState(((prevState) => ({
postData:{
...prevState.postData,
likes: prevState.postData.likes + 1,
}
});