我正在尝试清除数组,但遇到了麻烦。 this.setState({warnErrorTypes:[]})
我不确定我是否正在处理竞争条件,或者具体问题是什么,但我可以看到,在我需要将其值重置为 [] 的情况下,我的数组的值始终是错误的。
如何将包含 [1,2] 的数组替换为 [],然后再替换为 [3],其中满足以下条件:
- this.state.warnErrorTypes 是一个以 [] 开头的数组
- 根据条件,将 2 推入数组
- 根据条件,将 1 压入数组。
- 根据条件,3 未被推入数组
- 暂停。用户与 UI 交互
- 阵列被消隐:
this.setState({warnErrorTypes:[]})
- 根据条件,2 未被推入数组
- 根据条件,1 未被压入数组
- 根据条件,将 3 推入数组。
上面逻辑的结果总是 [2,1,3]
,而我期望它是 [3]
。
原文由 JZ. 发布,翻译遵循 CC BY-SA 4.0 许可协议
setState
被聚合和调度,它不会原子和立即运行,所以你不能只发出多个 setState() 调用并期望事情起作用,你要么必须等待状态更新,然后再更新再次使用它,或使用实例变量。选项1:
这是相当麻烦的,并且取决于您在做什么,主要是错误的代码。另一种选择是使用您在需要时作为状态发送的“真实”实例变量。
选项 2:
请记住,更新状态意味着您更改了组件的某个方面,需要重新渲染,因此如果您不打算重新渲染组件,请不要使用 setState,例如在清除数组和重新填充数组之间。分别做这些事情,只有在你完成后才更新状态。
选项 3:
您还可以通过取出状态值、运行更新然后重新绑定来完成此操作,而无需构建持久实例变量:
最终效果是一样的:你 只 在你的数据处于某种稳定的配置时更新你的用户界面,所以如果你认为你正在调用
setState()
在渲染之间不止一次,那就是一个问题:每setState()
调用可能会“最终”触发渲染,并且连续的setState()
如果您不等待它们先绑定,那么在此之前的调用将“覆盖”同名键值更新。