تجنّب اضطراب التخطيط والوميض المرئي
حدّد الحالات التي يسبب فيها useEffect وميضًا مرئيًا واستبدله بـ useLayoutEffect لإصلاح ذلك
تجنّب اضطراب التخطيط والوميض المرئي درس مجاني في React Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
ما المقصود بـ Layout Thrash
يحدث Layout Thrash عندما تتناوب JavaScript بين قراءة خصائص DOM والكتابة إلى DOM ضمن حلقة. فكل قراءة بعد عملية كتابة تجبر المتصفح على إعادة حساب التخطيط بشكل متزامن لإعادة قيمة دقيقة. وقد يحوّل ذلك ما يفترض أن يكون عملية حساب تخطيط واحدة إلى عشرات العمليات، مما يضر بالأداء بشدة.
كيف يساعد تجميع تحديثات React
يجمع React كل استدعاءات setState داخل معالجات الأحداث والتأثيرات في إعادة تصيير واحدة. ويمنع هذا التجميع الطبيعي نمط القراءة-الكتابة-القراءة الذي يسبب Layout Thrash ضمن دورة تصيير واحدة. وفي React 18، يمتد التجميع أيضًا إلى عمليات الاستدعاء غير المتزامنة وPromises، مما يقلل Layout Thrash الناتج عن تحديثات الحالة المتزامنة.
متى يحدث الوميض في useEffect
يحدث الوميض عندما يقرأ useEffect DOM، ثم يحدّث الحالة، مما يؤدي إلى إعادة التصيير، فيرسم المتصفح مرتين: مرة بالحالة الأولية ومرة بالحالة المصححة. يظهر الرسم الأول للحظات قبل استبداله. ويكون ذلك أوضح ما يكون في التأثيرات التي تعدّل خصائص التخطيط مثل الارتفاع أو العرض أو الموضع.
تشخيص الوميض باستخدام DevTools
افتحوا Chrome DevTools، وانتقلوا إلى تبويب Rendering عبر قائمة النقاط الثلاث ضمن More tools، ثم فعّلوا «Paint flashing». ستُبرز مناطق إعادة الرسم باللون الأخضر. إذا رأيتم مكوّناً يومض عند التصيير الأول ثم يُعاد رسمه فوراً بتخطيط مختلف، فهذا يؤكد حدوث رسم مزدوج بسبب تحديث حالة تقوده useEffect.
إصلاح الوميض بالنقل إلى useLayoutEffect
انقلوا قراءات DOM وتحديثات الحالة الناتجة عنها من useEffect إلى useLayoutEffect. يحدث القياس نفسه وتحديث الحالة الآن بشكل متزامن قبل الرسم، ثم يعيد React التصيير ويثبّت التغييرات ضمن الكتلة نفسها، فلا يرسم المتصفح إلا الحالة النهائية الصحيحة. ويختفي الوميض الأخضر في DevTools.
نمط الرسم الواحد
نمط تجنّب الوميض هو: قراءة DOM داخل useLayoutEffect، واستدعاء setState بالقياس، ثم يعيد React التصيير بشكل متزامن، ويثبّت DOM المصحح، ويرسم المتصفح مرة واحدة بالنتيجة النهائية. وهذا هو النمط القياسي لتحديد مواضع التلميحات، وإزاحات الرؤوس اللاصقة، وإعداد الرسوم المتحركة.
حالات الاستخدام الصحيحة لـ useEffect
تنتمي الغالبية العظمى من التأثيرات إلى useEffect: جلب البيانات، حيث يكون ظهور مؤشر التحميل مقبولاً ومتوقعاً، والاشتراك في الأحداث أو التدفقات، والتسجيل والتحليلات، والمؤقتات، وأي تأثير لا يؤثر فوراً في التخطيط المرئي. إن الإفراط في استخدام useLayoutEffect عندما يكون useEffect كافياً يُعد نمطاً مضاداً يضر بالأداء.
حالات الاستخدام الصحيحة لـ useLayoutEffect
احجزوا useLayoutEffect لقياسات DOM التي تؤثر مجدداً في المخرجات المرئية، مثل مواضع التلميحات، والمنطق المعتمد على حجم العنصر، واستعادة موضع التمرير، وإعداد الرسوم المتحركة الذي يقرأ الأبعاد الأولية. ومن الأعراض الواضحة التي تشير إلى ضرورة التبديل ظهور وميض مرئي يستمر إطاراً واحداً لتخطيط غير صحيح عند التصيير الأول.
مقارنة useEffect وuseLayoutEffect في الشيفرة
للدالتين التوقيع نفسه: useLayoutEffect(callback, deps) مقابل useEffect(callback, deps). والاختلاف الوحيد هو توقيت تنفيذ الدالة. يمكنكم التبديل بينهما بتغيير كلمة واحدة في الشيفرة. ابدؤوا باستخدام useEffect، ولا تغيّروه إلى useLayoutEffect إلا بعد التأكد من حدوث الوميض.
استخدام الدالتين معاً في مكوّن واحد
من الصحيح والشائع استخدام الدالتين معاً في المكوّن نفسه لمعالجة اهتمامات مختلفة. فعلى سبيل المثال، قد يستخدم مكوّن مخطط useLayoutEffect لقياس عرض الحاوية وتعيين SVG viewBox بشكل متزامن، ثم يستخدم useEffect لجلب بيانات المخطط بشكل غير متزامن. تتولى كل دالة الاهتمام الذي يكون التوقيت مهماً بالنسبة إليه.
اختبار الرسم المزدوج
إلى جانب وميض الرسم في DevTools، يمكنكم إضافة عدّاد إلى وحدة التحكم داخل المكوّن لعدّ عمليات التصيير. إذا سجّل مكوّن كلمة «render» مرتين عند التركيب الأول، مرة بالحالة الأولية ومرة بالقياس المصحح، فهذه حالة رسم مزدوج. من المفترض أن يؤدي نقل القياس إلى useLayoutEffect إلى تقليل ذلك إلى تسجيل تصيير واحد بعد التركيب، مع استثناء التكرار الذي يضيفه Strict Mode.
متى تفضّلون useLayoutEffect على useEffect
ما السيناريو الذي يبرّر استخدام useLayoutEffect بدلاً من useEffect؟
مراجعة الدرس: اضطراب التخطيط والوميض البصري
ينشأ اضطراب التخطيط من التناوب بين قراءة DOM والكتابة فيه. تمنع آلية التجميع في React معظم هذا الاضطراب ضمن عمليات التصيير. يحدث الوميض عندما يقيس useEffect DOM ويحدّث الحالة، مما يؤدي إلى رسمين. أصلحوا الوميض بنقل قياسات DOM إلى useLayoutEffect. واستخدموا useEffect افتراضياً لكل ما عدا ذلك: جلب البيانات، والاشتراكات، والتسجيل، والمؤقتات.
الأسئلة الشائعة
هل درس «تجنّب اضطراب التخطيط والوميض المرئي» مجاني؟
نعم — نص درس «تجنّب اضطراب التخطيط والوميض المرئي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «تجنّب اضطراب التخطيط والوميض المرئي»؟
حدّد الحالات التي يسبب فيها useEffect وميضًا مرئيًا واستبدله بـ useLayoutEffect لإصلاح ذلك تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تجنّب اضطراب التخطيط والوميض المرئي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- مرحلة العرض وتثبيت DOM
- متى يعمل useLayoutEffect مقارنةً بـ useEffect
- قياس عناصر DOM باستخدام useLayoutEffect
- تجنّب اضطراب التخطيط والوميض المرئي