تنفيذ Custom Hook باسم useDebounce
أنشئ hook باسم useDebounce يؤخر تحديثات الحالة حتى يتوقف المستخدم عن الكتابة
تنفيذ Custom Hook باسم useDebounce درس مجاني في React Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
توقيع الخطاف
يقبل الخطاف useDebounce قيمة وتأخيرًا بالمللي ثانية، ويُعيد نسخة مؤجَّلة باستخدام Debounce من تلك القيمة: function useDebounce(value, delay). وتتأخر القيمة المُعادة debouncedValue عن القيمة الفعلية، ولا تتحدث إلا بعد انقضاء التأخير المحدد دون حدوث تغيير آخر.
الحالة الداخلية لـ debouncedValue
داخل الخطاف، صرّح بمتغير حالة: const [debouncedValue, setDebouncedValue] = useState(value). تحتفظ هذه الحالة بآخر قيمة تم اعتمادها. وتبدأ مساوية للقيمة الأولية، ولا تتحدث إلا بعد انطلاق مؤقت Debounce. وترى المكوّنات التي تقرأ debouncedValue إدخالًا مستقرًا ومستقرًا نهائيًا.
useEffect مع setTimeout
يوجد المنطق الأساسي داخل useEffect: أنشئ مؤقتًا باستخدام setTimeout(() => setDebouncedValue(value), delay) وخزّن معرّفه. ويُنفَّذ التأثير في كل مرة تتغير فيها value أو delay. ويُطلَق المؤقت بعد delay من المللي ثانية من آخر تغيير، محدّثًا حالة Debounce.
مسح المؤقت أثناء التنظيف
تستدعي دالة التنظيف الخاصة بـ useEffect الدالة clearTimeout(timerId). عندما تتغير value قبل انطلاق المؤقت، ينفذ React عملية التنظيف، فيلغي التحديث المعلّق. ثم يُجدول مؤقت جديد. هذه هي الآلية الأساسية التي تجعل Debounce يعمل: إذ تؤدي التغييرات السريعة إلى إعادة ضبط المؤقت باستمرار.
تبعيات التأثير
ينبغي أن تحتوي مصفوفة تبعيات useEffect على [value, delay]. يُعاد تنفيذ التأثير كلما تغيرت قيمة الإدخال، بحيث يُجدول مؤقت جديد، وكذلك كلما تغير delay، تحسبًا لتعديل المستدعي لفترة Debounce ديناميكيًا. يجب تضمين القيمتين لتجنب مشكلات الإغلاق القديم.
استخدام الخطاف في مكوّن
الاستخدام مباشر: const debouncedSearch = useDebounce(searchInput, 300). ويطلق useEffect منفصل يعتمد على [debouncedSearch] استدعاء API. تتحدث حالة الإدخال (searchInput) فورًا، مما يحافظ على استجابة حقل الإدخال؛ أما استدعاء API وحده فينتظر Debounce.
حالة الحافة الخاصة بالاستدعاء الأول الفوري
افتراضيًا، يعمل التنفيذ القياسي عند الحافة اللاحقة فقط. ولإضافة وضع "فوري" يستدعي الدالة عند أول تشغيل، ثم يطبّق Debounce على الاستدعاءات اللاحقة، تحتاج إلى ref لتتبع ما إذا كان الاستدعاء قد تم، وإعادة ضبطه بعد انتهاء المهلة. هذا أكثر تعقيدًا، لكنه مفيد لأزرار الإرسال.
معامل النوع العام في TypeScript
اجعل الخطاف عامًا لضمان سلامة الأنواع: function useDebounce(value: T, delay: number): T. يتيح ذلك لـ TypeScript استنتاج نوع debouncedValue من نوع value. وينتقل المعامل العام T تلقائيًا عبر الحالة الداخلية ونوع القيمة المُعادة.
خطأ شائع: فقدان التنظيف
من الأخطاء المتكررة نسيان إعادة دالة التنظيف من useEffect. فبدون التنظيف، يؤدي كل تغيير في القيمة إلى إنشاء مؤقت جديد دون إلغاء المؤقت القديم. والنتيجة أن مؤقتات متعددة تنطلق، مما يؤدي إلى استدعاء setDebouncedValue عدة مرات بقيم قديمة، فيفقد Debounce وظيفته تمامًا.
المقارنة مع الأساليب القائمة على useRef
ثمة بديل يتمثل في تخزين دالة Debounce نفسها داخل useRef باستخدام lodash. وعلى خلاف الأسلوب القائم على الحالة، يطبّق أسلوب ref عملية Debounce على دوال الاستدعاء بدلًا من القيم. استخدم الخطاف القائم على الحالة عندما تحتاج إلى قيمة مشتقة، واستخدم أسلوب دالة الاستدعاء عندما تحتاج إلى تطبيق Debounce على معالج أحداث.
التحقق من السلوك الفعلي
تحقق من عمل الخطاف بإضافة سجل إلى وحدة التحكم داخل دالة الاستدعاء الخاصة بالمؤقت، ثم راقب وحدة تحكم المتصفح أثناء الكتابة بسرعة. ينبغي أن ترى سجلًا واحدًا لكل حدث "توقف"، لا سجلًا لكل ضغطة مفتاح. ويجب أن يكون عدد السجلات أقل بكثير من عدد ضغطات المفاتيح أثناء الكتابة السريعة.
تنظيف useEffect في useDebounce
لماذا يجب أن يعيد useEffect في useDebounce دالة تنظيف تستدعي clearTimeout؟
مراجعة الدرس: خطاف useDebounce
يحتفظ الخطاف useDebounce(value, delay) بحالة مؤجَّلة باستخدام Debounce، ولا تُحدَّث إلا بعد مرور delay من المللي ثانية من الصمت. يضبط useEffect الخاص به مهلة زمنية ويمسحها أثناء التنظيف لإلغاء المؤقتات القديمة. استخدم القيمة المؤجَّلة باستخدام Debounce كتابعية لتأثيرات جلب البيانات من API. أضف معاملًا عامًا في TypeScript لضمان سلامة الأنواع بالكامل.
الأسئلة الشائعة
هل درس «تنفيذ Custom Hook باسم useDebounce» مجاني؟
نعم — نص درس «تنفيذ Custom Hook باسم useDebounce» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «تنفيذ Custom Hook باسم useDebounce»؟
أنشئ hook باسم useDebounce يؤخر تحديثات الحالة حتى يتوقف المستخدم عن الكتابة تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «تنفيذ Custom Hook باسم useDebounce»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- أهمية Debounce وThrottle في واجهات المستخدم
- تنفيذ Custom Hook باسم useDebounce
- تنفيذ Custom Hook باسم useThrottle
- تطبيقات عملية: البحث والتمرير وتغيير الحجم