flushSync
Використання flushSync
є рідкісним і може зашкодити продуктивності вашого застосунку.
flushSync
дозволяє змусити React синхронно змивати будь-які оновлення всередині наданого колбеку. Це гарантує, що DOM буде оновлено негайно.
flushSync(callback)
Довідник
flushSync(callback)
Викличте flushSync
, щоб змусити React очистити будь-яку незавершену роботу і синхронно оновити DOM.
import { flushSync } from 'react-dom';
flushSync(() => {
setSomething(123);
});
У більшості випадків flushSync
можна уникнути. Використовуйте flushSync
у крайньому випадку.
Дивіться більше прикладів нижче.
Параметри
callback
: Функція. React негайно викличе цей зворотний виклик і синхронно очистить всі оновлення, які він містить. Він також може очистити будь-які відкладені оновлення, або Ефекти, або оновлення всередині Ефектів. Якщо оновлення призупиняється в результаті цього викликуflushSync
, запасні варіанти можуть бути показані повторно.
Повернення
flushSync
повертає undefined
.
Застереження
flushSync
може суттєво погіршити продуктивність. Використовуйте обережно.flushSync
може змусити відкладені межі Suspense показувати їхнійвідступний
стан.flushSync
може запускати відкладені ефекти та синхронно застосовувати будь-які оновлення, які вони містять, перед поверненням.flushSync
може виводити оновлення за межі зворотного виклику, якщо це необхідно для виведення оновлень всередині зворотного виклику. Наприклад, якщо є відкладені оновлення після кліку, React може змити їх перед тим, як змити оновлення всередині зворотного виклику.
Використання
Змивання оновлень для сторонніх інтеграцій
При інтеграції зі стороннім кодом, таким як API браузера або бібліотеки інтерфейсу користувача, може знадобитися змусити React очищати оновлення. Використовуйте Це гарантує, що до моменту запуску наступного рядка коду React вже оновить DOM. Використання Втім, він може бути корисним для інтеграції зі стороннім кодом, наприклад, API браузерів. Деякі браузерні API очікують, що результати всередині зворотного виклику будуть записані в DOM синхронно, до кінця виклику, щоб браузер міг щось зробити з відрендереним DOM. У більшості випадків React робить це автоматично. Але в деяких випадках може знадобитися примусове синхронне оновлення. Наприклад, API браузера flushSync
, щоб примусити React відмивати будь-які flushSync
є рідкісним, і його часте використання може суттєво зашкодити продуктивності вашого застосунку. Якщо ваш застосунок використовує лише React API, і не інтегрується зі сторонніми бібліотеками, flushSync
це має бути зайвим.onbeforeprint
дозволяє змінювати сторінку безпосередньо перед відкриттям діалогу друку. Це корисно для застосування користувацьких стилів друку, які дозволяють краще відобразити документ для друку. У прикладі нижче ви використовуєте flushSync
всередині зворотного виклику onbeforeprint
, щоб негайно "змити" стан React в DOM. Тоді, коли відкриється діалогове вікно друку, isPrinting
відобразить "yes":
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
як "ні". Це тому, що React пакує оновлення асинхронно і діалог друку відображається до того, як стан буде оновлено.
flushSync
може суттєво погіршити продуктивність, а також несподівано змусити відкладені межі очікування показати їхній резервний стан.
Здебільшого flushSync
можна уникнути, тому використовуйте flushSync
у крайньому випадку.