ორივე აწარმოებს effects-ებს, მაგრამ ბრაუზერის paint-ის შედარებით სხვადსხვა მომენტში — და ამ დროის განსხვავება სწორედ მთავარი პუნქტია.
ორივე აწარმოებს effects-ებს, მაგრამ ბრაუზერის paint-ის შედარებით სხვადსხვა მომენტში — და ამ დროის განსხვავება სწორედ მთავარი პუნქტია.
useEffect აწარმოებს მას შემდეგ, როდესაც ბრაუზერმა დახატა. ეს არის asynchronous და non-blocking. გამოიყენეთ ისგან თითქმის ყველაფრისთვის (data, subscriptions, logging).useLayoutEffect აწარმოებს სინქრონულად DOM-ის შეცვლის შემდეგ, მაგრამ ბრაუზერის paint-მდე. გამოიყენეთ მაშინ, როდესაც უნდა წაიკითხოთ layout და შეცვალოთ DOM ერთი frame-ში, რათა თავიდან აიცილოთ ხილული flicker.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-ის დროს, იგივე კოდი აწარმოებს paint-ის შემდეგ → ერთი frame-ის flicker.
useLayoutEffect-ში ხდის UI-ს დარტყმულ, რადგან ბრაუზერი ვერ ხატავს სანამ დასრულდება.თეორემის წესი: ნაგულისხმევად useEffect; გამოიყენეთ useLayoutEffect მხოლოდ სინქრონული DOM measurements/mutations-ისთვის, რომელიც სხვაგვარად flicker იქნებოდა.
IT გასაუბრების კითხვების ბიბლიოთეკა დეტალური პასუხებით — Junior-დან Senior-მდე.
შემოწირულობა