flushSync
允许你强制 React 同步刷新提供的回调函数内的任何更新。这确保 DOM 会立即更新。
flushSync(callback)
参考
flushSync(callback)
调用 flushSync
强制 React 刷新任何挂起的任务并同步更新 DOM。
import { flushSync } from 'react-dom';
flushSync(() => {
setSomething(123);
});
大多数情况下,可以避免使用 flushSync
。将 flushSync
作为最后手段。
参数
callback
:一个函数。React 将立即调用此回调函数并同步刷新其中包含的任何更新。它还可以刷新任何挂起的更新、Effects 或 Effects 内部的更新。如果由于此flushSync
调用导致更新挂起,则可能会重新显示回退。
返回值
flushSync
返回 undefined
。
警告
flushSync
会显著降低性能。谨慎使用。flushSync
可能会强制挂起的 Suspense 边界显示其fallback
状态。flushSync
可能会运行挂起的 Effects 并同步应用其中包含的任何更新,然后再返回。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 异步批量更新,并且在状态更新之前显示了打印对话框。