0Pricing
React Academy · درس

أهمية Debounce وThrottle في واجهات المستخدم

افهم تكلفة الأداء لمعالجات ضغطات المفاتيح والتمرير وتغيير الحجم غير المقيّدة، ومتى ينطبق كل حل

أهمية Debounce وThrottle في واجهات المستخدم درس مجاني في React Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

أحداث المستخدم عالية التواتر

تُطلَق بعض أحداث DOM بمعدلات عالية للغاية. يُطلَق حدث keypress مع كل ضغطة مفتاح. ويُطلَق حدث scroll عشرات المرات في الثانية أثناء التمرير. أما حدث resize فيُطلَق باستمرار أثناء سحب المستخدم لحافة النافذة. قد تؤدي معالجة كل حدث على حدة إلى إرهاق المتصفح والخادم معًا.

تكلفة معالجات الأحداث غير المقيّدة

إذا كان معالج keypress يجري استدعاءً لواجهة API مع كل ضغطة مفتاح، فإن مستخدمًا يكتب "React hooks" (11 حرفًا) يطلق 11 طلبًا عبر الشبكة، معظمها لاستعلامات غير مكتملة. وبالمثل، يؤدي تحديث رسوم متحركة للمنظور ثلاثي الأبعاد مع كل بكسل أثناء التمرير إلى مئات عمليات إعادة التصيير في React كل ثانية. وهذا يهدر وحدة المعالجة المركزية والشبكة والبطارية.

ما الذي يفعله Debounce

يؤخر Debounce التنفيذ حتى يتوقف الحدث عن الإطلاق لمدة محددة. إذا استمر المستخدم في الكتابة، يُعاد ضبط المؤقت مع كل ضغطة مفتاح. ولا يُنفَّذ المعالج مرة واحدة إلا بعد مرور N من المللي ثانية من الصمت. يجيب Debounce عن السؤال: "شغّل هذا بعد أن ينتهي المستخدم من القيام بشيء ما."

ما الذي يفعله Throttle

يحدّ Throttle التنفيذ بحد أقصى مرة واحدة خلال فترة زمنية، بغض النظر عن عدد الأحداث التي تُطلَق. إذا مرّر المستخدم بسرعة، يضمن Throttle مضبوط على 100ms ألا يعمل المعالج أكثر من 10 مرات في الثانية. يجيب Throttle عن السؤال: "شغّل هذا بانتظام، ولكن ليس أكثر من مرة كل N من المللي ثانية."

متى تستخدم Debounce

يكون Debounce الخيار الصحيح عندما تهتم فقط بالقيمة النهائية بعد توقف المستخدم. ومن الحالات الشائعة: حقل البحث، حيث يُرسَل طلب API بعد توقف الكتابة؛ ومعالج تغيير حجم النافذة، حيث يُعاد حساب التخطيط بعد انتهاء تغيير الحجم؛ والتحقق من حقول النماذج الذي يفحص خادمًا، حيث ينبغي الانتظار حتى يكتمل الإدخال قبل التحقق.

متى تستخدم Throttle

يكون Throttle الخيار الصحيح عندما تريد تحديثات منتظمة أثناء نشاط مستمر. ومن الحالات الشائعة: معالج موضع التمرير لتحديث شريط تقدم القراءة أو رأس ثابت بحد أقصى 30fps؛ وتتبع حركة الفأرة لتسجيل موضع المؤشر لأغراض التحليلات؛ ومعالجات أحداث السحب لتحديث موضع عنصر قابل للسحب بسلاسة دون إغراق التطبيق بالأحداث.

للتنفيذات الساذجة عيوب

تؤدي كتابة Debounce أو Throttle من الصفر دون فهم كامل إلى أخطاء مثل فقدان الحدث الأخير (الحافة اللاحقة)، أو الإطلاق عند حواف غير صحيحة، أو عدم تنظيف المؤقتات عند إلغاء تركيب المكوّن. يكون من الأفضل عمومًا استخدام تنفيذات مجرّبة جيدًا من مكتبات مثل lodash، إذ تتعامل مع جميع الحالات الطرفية على نحو صحيح.

lodash.debounce وlodash.throttle

توفر Lodash الدالتين _.debounce(fn, wait) و_.throttle(fn, wait) مع خيارات للتحكم في سلوك الحافة الأولى والحافة اللاحقة. وتمتلك الدالة المُعادة الأسلوب .cancel() لإلغاء استدعاء معلّق، والأسلوب .flush() لتنفيذه فورًا. ينبغي تغليف هاتين الدالتين باستخدام useRef في React لتجنب إعادة إنشائهما عند إعادة التصيير.

ميزانية الأداء

حتى 50 عملية إعادة تصيير إضافية في الثانية بسبب معالج تمرير غير مقيّد يمكن أن تستهلك قدرًا ملحوظًا من وحدة المعالجة المركزية، لا سيما على الأجهزة المحمولة منخفضة الإمكانات. وتعني ميزانية الإطار البالغة 16ms (60fps) أن كل عملية إعادة تصيير يجب أن تكتمل خلال أقل من 16 مللي ثانية لتجنب إسقاط الإطارات. يُعد Debounce وThrottle خط دفاعك الأول ضد مشكلات معدل الإطارات.

معالج الحدث مقابل تحديث الحالة

لا تحتاج جميع المعالجات عالية التواتر إلى Debounce. فإذا كان معالج الحدث يقرأ قيمة فقط دون تحديث الحالة أو استدعاء واجهات API — مثل تسجيل آخر موضع للفأرة في ref — فلا حاجة إلى Debounce. استخدم Debounce أو Throttle فقط مع المعالجات التي تطلق عمليات مكلفة، مثل تحديثات الحالة أو استدعاءات API أو قياسات DOM.

إلغاء الدوال المؤجَّلة باستخدام Debounce

عند إلغاء تركيب مكوّن، ينبغي إلغاء أي استدعاء معلّق يستخدم Debounce لمنع تحديث الحالة بعد إلغاء التركيب. إذا استخدمت useRef لتخزين الدالة المؤجَّلة، فاستدعِ debouncedFn.cancel() في عملية التنظيف الخاصة بـ useEffect. توفر دوال Lodash التي تستخدم Debounce هذا الأسلوب لهذا الغرض تحديدًا.

استخدام Debounce أم Throttle

أي تقنية ينبغي استخدامها لإطلاق استدعاء API عندما يتوقف المستخدم عن الكتابة في حقل بحث؟

مراجعة الدرس: Debounce وThrottle

قد تسبب الأحداث عالية التواتر، مثل keypress وscroll وresize، مشكلات في الأداء إذا نُفذت المعالجات مع كل حدث. ينتظر Debounce فترة الصمت، وهو الأنسب لحقول البحث ومعالجات تغيير الحجم. أما Throttle فيحدّ من التواتر، وهو الأنسب للتمرير والسحب. استخدم تنفيذات Lodash المخزّنة في المراجع، واحرص دائمًا على إلغائها عند إلغاء تركيب المكوّن.

الأسئلة الشائعة

هل درس «أهمية Debounce وThrottle في واجهات المستخدم» مجاني؟

نعم — نص درس «أهمية Debounce وThrottle في واجهات المستخدم» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «أهمية Debounce وThrottle في واجهات المستخدم»؟

افهم تكلفة الأداء لمعالجات ضغطات المفاتيح والتمرير وتغيير الحجم غير المقيّدة، ومتى ينطبق كل حل تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «أهمية Debounce وThrottle في واجهات المستخدم»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. أهمية Debounce وThrottle في واجهات المستخدم
  2. تنفيذ Custom Hook باسم useDebounce
  3. تنفيذ Custom Hook باسم useThrottle
  4. تطبيقات عملية: البحث والتمرير وتغيير الحجم
← العودة إلى React Academy