【发布时间】:2021-03-29 21:18:03
【问题描述】:
如 this question 中所述,React 在 React 事件处理程序中批量状态更新调用。
如果从基于 React 的事件中触发状态更新,例如按钮单击或输入更改,React 当前将批量更新状态。如果它们是在 React 事件处理程序之外触发的,它不会批量更新,比如异步调用。
即,当从 React 事件处理程序回调中调用时,setFoo 和 setBar 将融合在一起。
我正在处理各种第三方库,其中一些包装了非 React JS 库。我正在向它们传递回调,我想知道这些回调是否属于“React 事件处理程序”类别,即状态更新批处理是否适用于它们。
有没有办法手动检查状态更新是否是批处理的,或者等效地,是否在 React 事件处理程序中执行了某些代码?我正在考虑进行临时检查,例如:
let callback = () => {
// fictitious checks
console.log(ReactDOM.checkIfUpdatesAreBatched());
console.log(ReactDOM.checkIfRunningInReactEventHandler());
setFoo("foo");
setBar("bar");
}
编辑:我不想知道这一点的原因是为了确保Foo 和Bar 更新是原子的,以保持一致性。当然我可以将状态融合在一起,但这会带来性能问题,因为setFooAndBar 会触发太多组件重新渲染,这当然可以通过进一步的记忆来缓解......如果我能证明setFoo 和@ 987654330@ 始终使用更新批处理运行,状态分离是合理的。
【问题讨论】:
标签: reactjs react-hooks