我如何链接状态更新?
How do I chain state updates?
我有一个包含多个控件的表单,可以将所有内容保存到一个变量中。每个控件都有一个 onChanged
函数,该函数 运行 使用该控件的新值进行状态更新:
function onChangedValUpdate(newVal){
let fields = clone(this.state.fields);
fields[controlId] = newVal;
this.setState({fields});
}
我的控件是动态创建的,当它们创建时,它们 运行 onChangedValUpdate
在它们的初始值上,如果存在的话。问题是,有时会同时创建很多控件,React 会在每次更新时使用相同的克隆 fields
对象将其 setState
排队。该对象在 setState
秒之间没有更新,大概是出于与 类似的原因。这意味着,实际上,除一个控件的更新外,所有控件的更新都被覆盖。
我尝试编写一个过于智能的例程,它使用 setState
的回调仅 运行 如果没有正在进行的回调并记住对 [=15= 所做的更改] 变量在 setState
s 之间,但 React 和 运行 我所有排队的更新同时进行。不管怎样,这个例程感觉太做作了。
我确定这是一个微不足道且已解决的问题,但我似乎无法以 Google 可用的方式来表述我的问题。我如何链接并发发生的状态更新,并且其中可能有任何数量?
编辑 为了后代,我的解决方案,感谢尤里:
function onChangedValUpdate(newVal){
this.setState( state => {
let fields = clone(state.fields);
fields[controlId] = newVal;
return {fields};
}
}
您可以将变异函数传递给 setState
。这将防止覆盖批量更新,因为每个回调都会获得最近的先前状态。
function onChangedValUpdate(newVal){
this.setState(function(state){
const fields = clone(state.fields)
fields[controlId] = newVal
return {fields: fields}
});
}
或者使用对象传播和增强的对象字面量。
function onChangedValUpdate(newVal){
this.setState(({fields}) => ({fields: {...fields, [controlId]: newVal}}));
}
我有一个包含多个控件的表单,可以将所有内容保存到一个变量中。每个控件都有一个 onChanged
函数,该函数 运行 使用该控件的新值进行状态更新:
function onChangedValUpdate(newVal){
let fields = clone(this.state.fields);
fields[controlId] = newVal;
this.setState({fields});
}
我的控件是动态创建的,当它们创建时,它们 运行 onChangedValUpdate
在它们的初始值上,如果存在的话。问题是,有时会同时创建很多控件,React 会在每次更新时使用相同的克隆 fields
对象将其 setState
排队。该对象在 setState
秒之间没有更新,大概是出于与
我尝试编写一个过于智能的例程,它使用 setState
的回调仅 运行 如果没有正在进行的回调并记住对 [=15= 所做的更改] 变量在 setState
s 之间,但 React 和 运行 我所有排队的更新同时进行。不管怎样,这个例程感觉太做作了。
我确定这是一个微不足道且已解决的问题,但我似乎无法以 Google 可用的方式来表述我的问题。我如何链接并发发生的状态更新,并且其中可能有任何数量?
编辑 为了后代,我的解决方案,感谢尤里:
function onChangedValUpdate(newVal){
this.setState( state => {
let fields = clone(state.fields);
fields[controlId] = newVal;
return {fields};
}
}
您可以将变异函数传递给 setState
。这将防止覆盖批量更新,因为每个回调都会获得最近的先前状态。
function onChangedValUpdate(newVal){
this.setState(function(state){
const fields = clone(state.fields)
fields[controlId] = newVal
return {fields: fields}
});
}
或者使用对象传播和增强的对象字面量。
function onChangedValUpdate(newVal){
this.setState(({fields}) => ({fields: {...fields, [controlId]: newVal}}));
}