Javascript 使用嵌套对象调用setState无法正确更新状态
我有一个React组件,它维护几个子组件的状态。通过Javascript 使用嵌套对象调用setState无法正确更新状态,javascript,reactjs,Javascript,Reactjs,我有一个React组件,它维护几个子组件的状态。通过componentDidMount()我正在从子组件调用父组件中的此函数: change = (fieldset, field, data) => { this.setState({ [fieldset]: { ...this.state[fieldset], [field]: data, } }) } 考虑使用模式的form/fieldset/field,但字段调用上述函数 我遇到的问题
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 wheresetState()
并不总是立即更新组件。它可以批处理更新或将更新推迟到以后。这使得调用setState()
后立即读取This.state
成为一个潜在的陷阱。相反,请使用componentDidUpdate或setState回调(setState(updater,callback)
),这两种回调都保证在应用更新后触发。如果您需要根据以前的状态设置状态,请阅读下面的更新程序参数。@samanime,这是正确的。是的,这就是我的意思。这非常有效-抱歉@ArupRakshit,我不知道这是您的意思。状态参数指的是prevstate?@Omar我不喜欢称它为“prev”。因为实际上它在某种意义上并不是以前的状态,而是当前状态,包括迄今为止应用的挂起的更改。docs说的是prevstate,但我可以大致看出您来自哪里