flushSync
flushSync permite forzar a React a que vacíe cualquier actualización dentro del callback proporcionado de forma sincrónica. Esto asegura que el DOM se actualiza inmediatamente.
flushSync(callback)Uso
Actualización de las integraciones de terceros
Cuando se integra con código de terceros, como las APIs del navegador o las bibliotecas de interfaz de usuario, puede ser necesario forzar a React a vaciar las actualizaciones. Utiliza flushSync para forzar a React a que vacíe cualquier actualización de estado dentro del callback de forma sincrónica:
flushSync(() => {
setState(true);
});
// Mediante esta línea se actualiza el DOM.Esto garantiza que, para cuando se ejecute la siguiente línea de código, React ya haya actualizado el DOM.
Usar flushSync es poco común, y usarlo con frecuencia puede afectar significativamente el rendimiento de su aplicación. Si su aplicación solo usa las API de React y no se integra con bibliotecas de terceros, flushSync debería ser innecesario.
Sin embargo, puede ser útil para la integración con código de terceros, como las API de los navegadores.
Algunas APIs de los navegadores esperan que los resultados dentro de los callbacks se escriban en el DOM de forma sincrónica, al final del callback, para que el navegador pueda hacer algo con el DOM renderizado. En la mayoría de los casos, React se encarga de esto automáticamente. Pero en algunos casos puede ser necesario salir de React y forzar una actualización sincrónica.
Por ejemplo, la API onbeforeprint del navegador permite cambiar la página inmediatamente antes de que se abra el diálogo de impresión. Esto es útil para aplicar estilos de impresión personalizados que permiten que el documento se muestre mejor para la impresión.
En el ejemplo siguiente, se utiliza flushSync dentro de la llamada de retorno onbeforeprint para “vaciar” inmediatamente el estado de React en el DOM. Al hacer esto, cuando el diálogo de impresión se abre, el estado se ha actualizado en isPrinting es “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> </> ); }
Si eliminas la llamada a flushSync, entonces cuando el diálogo de impresión mostrará isPrinting como “no”. Esto se debe a que React agrupa las actualizaciones de forma asíncrona y el diálogo de impresión se muestra antes de que se actualice el estado.
Referencia
flushSync(callback)
Llama a flushSync para forzar a React a vaciar cualquier trabajo pendiente y actualizar el DOM de forma sincrónica.
flushSync(() => {
setState(true);
});La mayoría de las veces, flushSync puede evitarse. Utilice flushSync como último recurso.
Parametros
callback: Una función. React llamará inmediatamente a esta llamada de retorno y vaciará cualquier actualización que contenga de forma sincrónica. También puede vaciar cualquier actualización pendiente, o efectos, o actualizaciones dentro de efectos. Si una actualización se suspende como resultado de esta llamadaflushSync, los fallbacks pueden volver a mostrarse.
Devuelve
flushSync devuelve undefined.
Advertencias
flushSyncpuede perjudicar significativamente el rendimiento. Utilícelo con moderación.flushSyncpuede forzar que los límites de suspensión pendientes muestren su estado defallback.flushSyncpueden ejecutar los efectos pendientes y aplicar sincrónicamente las actualizaciones que contengan antes de regresar.flushSyncpuede vaciar las actualizaciones fuera del callback cuando sea necesario para vaciar las actualizaciones dentro del callback. Por ejemplo, si hay actualizaciones pendientes de un clic, React puede vaciarlas antes de vaciar las actualizaciones dentro de la devolución de llamada.