Και οι δύο εκτελούν effects, αλλά σε διαφορετικές στιγμές σχετικά με τη ζωγραφική του περιηγητή — και αυτή η διαφορά χρονισμού είναι όλη η ιδέα.
Και οι δύο εκτελούν effects, αλλά σε διαφορετικές στιγμές σχετικά με τη ζωγραφική του περιηγητή — και αυτή η διαφορά χρονισμού είναι όλη η ιδέα.
useEffect εκτελείται μετά από το ζωγράφισμα του περιηγητή. Είναι ασύγχρονο και μη-αποκλειστικό. Χρησιμοποιήστε το για σχεδόν τα πάντα (δεδομένα, συνδρομές, καταγραφή).useLayoutEffect εκτελείται σύγχρονα μετά τη μετάλλαξη του DOM αλλά ΠΡΙΝ το ζωγράφισμα του περιηγητή. Χρησιμοποιήστε το όταν πρέπει να διαβάσετε τη διάταξη και να αλλάξετε το DOM στο ίδιο καρέ για να αποφύγετε ορατό τρεμόπλιγμα.render → DOM updated → [useLayoutEffect runs] → browser paints → [useEffect runs]
Φανταστείτε τη μέτρηση ενός στοιχείου και την αναπροσαρμογή ενός tooltip με βάση το μέγεθός του. Με το useEffect, ο χρήστης θα έβλεπε συνοπτικά το tooltip στο λάθος σημείο, μετά πηδά:
useLayoutEffect(() => {
const { height } = ref.current.getBoundingClientRect();
setTooltipTop(-height); // applied BEFORE paint → no visible jump
}, []);
Με το useEffect, ο ίδιος κώδικας εκτελείται μετά το ζωγράφισμα → ένα τρεμόπλιγμα ενός καρέ.
useLayoutEffect κάνει την διεπαφή ακατάστατη, επειδή ο περιηγητής δεν μπορεί να ζωγραφίσει μέχρι να τελειώσει.Κανόνας του αντίχειρα: προεπιλογή στο useEffect; χρησιμοποιήστε το useLayoutEffect μόνο για σύγχρονες μετρήσεις/μεταλλάξεις DOM που διαφορετικά θα τρεμόπλιζαν.