我的代码中具有以下setState函数...
this.setState(
(prev,props)=>{
if(prev.qsRemaining===1){this.deActivateDJM();}
if(prev.qsRemaining>0){
let newQs = prev.qsRemaining-1
console.log("Decrementing qsRemaining to:", newQs );
return {
qsRemaining: newQs,
canary:"Tweet!",
}
}
},
()=>{ console.log("qsRemaining is now:", this.state.qsRemaining ); }
);
第一个日志显示了从初始值20到20的正确递减值。第二个日志在理论上是在setState结束之后运行的,它显示了原始值20。看到“ canary”已添加到状态对象,但qsRemaining仍设置为20。
在我的代码中只有另一个地方,任何东西都分配给qsRemaining,并且在上述过程中或之后的任何时间都绝对不会被调用。
在四处搜寻之后,我确保在班级开始时有一个完整且正确的构造函数,但这没什么区别。
我很困惑。值未设置,或者某些值正在重置,但我觉得我已经消除了这两种可能性。我被困住了。有人可以建议下一步在哪里/如何/什么检查吗?
答案 0 :(得分:0)
因此事实证明这是由流氓 setState(this.state)引起的异步问题(意外惊喜!),该流氓是为响应发生的存储子系统更改而触发的事件触发的在上面的代码中调用setState()之后不久。
具有讽刺意味的是,我最初使用的是恶意的 forceUpdate(),以便响应外部事件重新渲染组件。后来,一如既往地努力成为更好的编码器,我将其更改为setState(this.state),因为我不断阅读到forceUpdate()是邪恶的,而使用setState(this.state)是正确的强制“响应式”方法重新渲染。
好吧,我现在回到forceUpdate()!如果会导致任何问题,我将发布更新!