flushSync
கொடுக்கப்பட்ட callback-க்குள் உள்ள updates-ஐ synchronously flush செய்ய React-ஐ force செய்ய flushSync உதவுகிறது. இதனால் DOM உடனடியாக update ஆகிறது என்பதை உறுதிசெய்கிறது.
flushSync(callback)குறிப்பு
flushSync(callback)
Pending work எதையும் flush செய்து DOM-ஐ synchronously update செய்ய React-ஐ force செய்ய flushSync-ஐ call செய்யுங்கள்.
import { flushSync } from 'react-dom';
flushSync(() => {
setSomething(123);
});பெரும்பாலும், flushSync-ஐத் தவிர்க்கலாம். கடைசி வழியாக மட்டுமே flushSync பயன்படுத்துங்கள்.
மேலும் உதாரணங்களை கீழே பார்க்கவும்.
Parameters
callback: ஒரு function. React இந்த callback-ஐ உடனடியாக call செய்து, இதில் உள்ள updates-ஐ synchronously flush செய்யும். Pending updates, Effects, அல்லது Effects-க்குள் உள்ள updates-ஐயும் flush செய்யலாம். இந்தflushSynccall-ன் விளைவாக ஒரு update suspend ஆனால், fallbacks மீண்டும் காட்டப்படலாம்.
Returns
flushSync undefined return செய்கிறது.
Caveats
flushSyncperformance-ஐ குறிப்பிடத்தக்க அளவில் பாதிக்கலாம். குறைவாக பயன்படுத்துங்கள்.- Pending Suspense boundaries அவற்றின்
fallbackstate-ஐ காட்டflushSyncforce செய்யலாம். - Return செய்வதற்கு முன் pending Effects-ஐ run செய்து, அவற்றில் உள்ள updates-ஐ synchronously apply செய்ய
flushSyncசெய்யலாம். - Callback-க்குள் உள்ள updates-ஐ flush செய்ய தேவையானபோது, callback-க்கு வெளியிலுள்ள updates-ஐயும்
flushSyncflush செய்யலாம். உதாரணமாக, ஒரு click-இலிருந்து pending updates இருந்தால், callback-க்குள் உள்ள updates-க்கு முன் React அவற்றை flush செய்யலாம்.
பயன்பாடு
Third-party integrations-க்காக updates flush செய்தல்
Browser APIs அல்லது UI libraries போன்ற third-party code உடன் integrate செய்யும்போது, updates-ஐ flush செய்ய React-ஐ force செய்ய வேண்டியிருக்கலாம். Callback-க்குள் உள்ள state updates-ஐ synchronously flush செய்ய React-ஐ force செய்ய flushSync-ஐப் பயன்படுத்துங்கள்:
flushSync(() => {
setSomething(123);
});
// By this line, the DOM is updated.அடுத்த code line run ஆகும் நேரத்திற்குள் React ஏற்கனவே DOM-ஐ update செய்துவிட்டதை இது உறுதிசெய்கிறது.
flushSync பயன்படுத்துவது அரிதானது; அதை அடிக்கடி பயன்படுத்துவது உங்கள் app-ன் performance-ஐ குறிப்பிடத்தக்க அளவில் பாதிக்கலாம். உங்கள் app React APIs மட்டும் பயன்படுத்தி, third-party libraries உடன் integrate செய்யவில்லை என்றால், flushSync தேவையில்லை.
ஆனால் browser APIs போன்ற third-party code உடன் integrate செய்ய இது உதவியாக இருக்கலாம்.
சில browser APIs, callbacks-க்குள் உள்ள results callback முடியும் நேரத்திற்குள் DOM-இல் synchronously எழுதப்பட்டிருக்க வேண்டும் என்று எதிர்பார்க்கின்றன; அப்போதுதான் browser rendered DOM-ஐ வைத்து ஏதாவது செய்ய முடியும். பெரும்பாலான சூழல்களில் React இதை உங்களுக்காக தானாக கையாளுகிறது. ஆனால் சில சூழல்களில் synchronous update-ஐ force செய்ய வேண்டியிருக்கலாம்.
உதாரணமாக, browser onbeforeprint API print dialog திறக்கும் முன் page-ஐ உடனடியாக மாற்ற அனுமதிக்கிறது. Printing-க்கு document சிறப்பாக display ஆக custom print styles apply செய்ய இது பயனுள்ளது. கீழே உள்ள உதாரணத்தில், React state-ஐ DOM-க்கு உடனடியாக “flush” செய்ய onbeforeprint callback-க்குள் flushSync பயன்படுத்துகிறீர்கள். பிறகு print dialog திறக்கும் நேரத்திற்குள், 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 இல்லையெனில், print dialog isPrinting-ஐ "no" என்று காட்டும். ஏனெனில் React updates-ஐ asynchronously batch செய்கிறது; state update ஆகும் முன்பே print dialog காட்டப்படுகிறது.
சிக்கல் தீர்வு
“flushSync was called from inside a lifecycle method” என்ற error வருகிறது
ஒரு render நடுவில் React flushSync செய்ய முடியாது. அப்படிச் செய்தால், அது noop ஆகி warning காட்டும்:
இதில் flushSync-ஐ பின்வரும் இடங்களில் call செய்வதும் அடங்கும்:
- ஒரு component render செய்யும்போது.
useLayoutEffectஅல்லதுuseEffecthooks-இல்.- Class component lifecycle methods-இல்.
உதாரணமாக, Effect-இல் flushSync call செய்தால் அது noop ஆகி warning காட்டும்:
import { useEffect } from 'react';
import { flushSync } from 'react-dom';
function MyComponent() {
useEffect(() => {
// 🚩 Wrong: calling flushSync inside an effect
flushSync(() => {
setSomething(newValue);
});
}, []);
return <div>{/* ... */}</div>;
}இதைக் சரிசெய்ய, பொதுவாக flushSync call-ஐ ஒரு event-க்கு நகர்த்த வேண்டும்:
function handleClick() {
// ✅ Correct: flushSync in event handlers is safe
flushSync(() => {
setSomething(newValue);
});
}Event-க்கு நகர்த்துவது கடினமாக இருந்தால், microtask-இல் flushSync-ஐ defer செய்யலாம்:
useEffect(() => {
// ✅ Correct: defer flushSync to a microtask
queueMicrotask(() => {
flushSync(() => {
setSomething(newValue);
});
});
}, []);இது தற்போதைய render முடிவதற்கு அனுமதித்து, updates-ஐ flush செய்ய மற்றொரு synchronous render-ஐ schedule செய்யும்.