我有两个状态结果,最初设置为零,val初始设置为1。 在乘法函数中,我改变了状态,如下所示。
multiply(){
console.log('multiply is clicked');
console.log('numberformed is '+this.state.numberformed);
this.setState(()=>{
return{
val:this.state.val*this.state.numberformed,
result:this.state.val,
};
});
}
这里this.state.numberformed输出12,因为我使用控制台检查。 我希望结果等于12所以我首先改变了val,因为它在代码中看到但是结果仍然是1,这是val的初始状态而不是val的改变状态。我应该怎么做?
答案 0 :(得分:1)
setState
的棘手部分是该名称有点误导。它实际上更像是scheduleStateUpdate
。
您提供给setState
的函数会在更新时返回React将与this.state
合并的对象。在更新发生之前,this.state
始终引用当前状态。在return语句中,更新肯定没有发生,因为更新尚未安排。 return语句用于安排更新。
看起来这可能是你想要做的事情:
this.setState(() => {
const val = this.state.val * this.state.numberformed
return {
result: val
}
})
return语句的括号可能会使你绊倒。是的,它看起来很像一个函数体的括号,或者其中一些语句。但它实际上是从函数返回一个javascript 对象。
声明
return {
result: val
}
概念上看起来更像是这样:
return (
{ result: val }
)
这会将名为result
的密钥添加到this.state
,可以this.state.result
访问。在您的代码中,假设result
实际上已分配了您期望的值,则会将两个键添加到状态:val
和result
,两者都具有完全相同的值。< / p>
由于您使用简单的计算更新state
,因此您可以制作更短的版本而不使用像val
这样的中间变量,甚至可以使用函数:
this.setState({result: this.state.val * this.state.numberformed})
或者,更可读:
const { val, numberformed } = this.state
this.setState({result: val * numberformed})
这会将this.state.result
设置为乘法的结果,并保持this.state
的每个其他键不变。