Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用嵌套对象调用setState无法正确更新状态_Javascript_Reactjs - Fatal编程技术网

Javascript 使用嵌套对象调用setState无法正确更新状态

Javascript 使用嵌套对象调用setState无法正确更新状态,javascript,reactjs,Javascript,Reactjs,我有一个React组件,它维护几个子组件的状态。通过componentDidMount()我正在从子组件调用父组件中的此函数: change = (fieldset, field, data) => { this.setState({ [fieldset]: { ...this.state[fieldset], [field]: data, } }) } 考虑使用模式的form/fieldset/field,但字段调用上述函数 我遇到的问题

我有一个React组件,它维护几个子组件的状态。通过
componentDidMount()
我正在从子组件调用父组件中的此函数:

change = (fieldset, field, data) => {
  this.setState({
    [fieldset]: {
      ...this.state[fieldset],
      [field]: data,
    }
  })
}
考虑使用模式的form/fieldset/field,但字段调用上述函数

我遇到的问题是,我相信我很快连续多次调用这个函数,这会让我感到困惑,因为除了一个或两个项目之外,状态并没有更新

我曾尝试使用
Object.assign()
来避免状态突变,但在大多数情况下,即使在我开始读取当前开始的位置,状态也没有正确更新


这是否违反了React最佳实践?子组件在父组件中调用
setState
是否有更好的方法?

因为更新状态的方式取决于状态本身,所以需要使用函数而不是对象

change = (fieldset, field, data) => {
  this.setState(prevState => ({
    [fieldset]: {
      ...prevState[fieldset],
      [field]: data,
    }
  }))
}
功能将一个接一个地应用。因此,您不会覆盖任何挂起的更改

this.setState({quantity:this.state.quantity+1})

this.setState({quantity:this.state.quantity+1})

后续调用将覆盖同一时间内以前调用的值 循环,因此数量只会增加一次。如果下一个 状态取决于之前的状态,建议使用更新程序 函数形式


为什么不将更新程序函数与
setState()
一起使用呢?我不知道你所说的“更新程序函数”是什么意思?只是仔细检查一下,
change()
是不是父级中的一个函数,作为一个道具传递给子级,然后在更改某些内容时调用它?@Toby where
setState()
并不总是立即更新组件。它可以批处理更新或将更新推迟到以后。这使得调用
setState()
后立即读取
This.state
成为一个潜在的陷阱。相反,请使用componentDidUpdate或setState回调(
setState(updater,callback)
),这两种回调都保证在应用更新后触发。如果您需要根据以前的状态设置状态,请阅读下面的更新程序参数。@samanime,这是正确的。是的,这就是我的意思。这非常有效-抱歉@ArupRakshit,我不知道这是您的意思。状态参数指的是prevstate?@Omar我不喜欢称它为“prev”。因为实际上它在某种意义上并不是以前的状态,而是当前状态,包括迄今为止应用的挂起的更改。docs说的是prevstate,但我可以大致看出您来自哪里