在 setState() 中增加状态对象值是不是有效?不克隆对象?

Posted

技术标签:

【中文标题】在 setState() 中增加状态对象值是不是有效?不克隆对象?【英文标题】:Is it valid to increment a state object value inside setState(); without cloning the object?在 setState() 中增加状态对象值是否有效?不克隆对象? 【发布时间】:2020-10-01 12:13:40 【问题描述】:

setState(return ) 中增加一些ingredients 值而不克隆ingredients。可以吗?

state = 
   // The object I need to increment its value.
   ingredients: 
      sugar: 0,
      salt: 0,
      pepper: 0
   ,
   count: 0


addSugarHandler = () => 
   this.setState((prevState, props) => 
      return 
         // Incrementing some `ingredients` value
         // inside `setState()` without cloning it.
         // Is it OK?
         ingredients: prevState.ingredients.sugar + 1,
         // I am sure the following is valid
         count: prevState.count + 1
      ;
   );

【问题讨论】:

我认为这不会像你想要的那样工作。这只会用不是一个对象覆盖你的成分,而是用 suger +1 中的数字代替。所以,当然,你可以这样做,但你的成分对象会在这个过程中丢失。 最初 ingredients 是一个对象。第一次更新后,它变成一个数字。之后它总是NaN。所以答案是否定的,除非你真的需要这种奇怪的行为。 谢谢@YuryTarabanko,我没有注意到非常不正确的递增:) @YuryTarabanko BTW :) 最后一行有效吗? count: prevState.count + 1 @SalehRezq LGTM 【参考方案1】:

您可以这样做。但是需要进行一些更正。 应该是这样的。

    this.setState((prevState, props) => 
      return 
       ingredients: 
         ...ingredients,
         sugar: prevState.ingredients.sugar + 1
       ,
       count: prevState.count + 1
     ;
   );

【讨论】:

count 不是 state.ingredients 的一部分,您应该将其下移一行

以上是关于在 setState() 中增加状态对象值是不是有效?不克隆对象?的主要内容,如果未能解决你的问题,请参考以下文章

在父 setState 之后,子状态对象被替换(initState)而不是更新(didUpdateWidget)

REACT 如何在 setState 中存储对象而不是对象数组?

为啥状态对象的名称不需要与setState中的名称匹配?

如何在功能组件的状态对象中使用 setState?

我的有状态小部件不会更新 ui,即使我正在调用 setState 并将正确的值传递给小部件类

React - 使用 setState 更新状态中的对象数组