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,

  }
});