flushSync
允许你强制 React 同步刷新提供的回调函数内的任何更新。 这确保了 DOM 立即更新。
flushSync(callback)
参考
flushSync(callback)
调用 flushSync
强制 React 刷新任何挂起的任务并同步更新 DOM。
import { flushSync } from 'react-dom';
flushSync(() => {
setSomething(123);
});
大多数情况下,可以避免使用 flushSync
。 将 flushSync
作为最后的手段。
参数
callback
:一个函数。 React 会立即调用此回调函数,并同步刷新它包含的任何更新。 它也可能刷新任何挂起的更新、Effect 或 Effect 内部的更新。 如果更新因这次flushSync
调用而挂起,则回退组件可能会重新显示。
返回值
flushSync
返回 undefined
。
注意事项
flushSync
可能会严重损害性能。 请谨慎使用。flushSync
可能会强制挂起的 Suspense 边界显示其fallback
状态。flushSync
可能会运行挂起的 Effect,并在返回之前同步应用它们包含的任何更新。flushSync
可能会在必要时刷新回调函数外部的更新,以便刷新回调函数内部的更新。 例如,如果有来自点击的挂起更新,React 可能会在刷新回调函数内部的更新之前刷新这些更新。
用法
import { useState, useEffect } from 'react'; import { flushSync } from 'react-dom'; export default function PrintApp() { const [isPrinting, setIsPrinting] = useState(false); useEffect(() => { function handleBeforePrint() { flushSync(() => { setIsPrinting(true); }) } function handleAfterPrint() { setIsPrinting(false); } window.addEventListener('beforeprint', handleBeforePrint); window.addEventListener('afterprint', handleAfterPrint); return () => { window.removeEventListener('beforeprint', handleBeforePrint); window.removeEventListener('afterprint', handleAfterPrint); } }, []); return ( <> <h1>isPrinting: {isPrinting ? 'yes' : 'no'}</h1> <button onClick={() => window.print()}> Print </button> </> ); }
如果不使用 flushSync
,打印对话框将显示 isPrinting
为“no”。这是因为 React 异步批处理更新,并且在状态更新之前就显示了打印对话框。