0Pricing
React Academy · درس

اقتراحات غير متزامنة مع Debounce

اجلب الاقتراحات من API أثناء كتابة المستخدم، مع استخدام Debounce لتجنّب الطلبات الشبكية الزائدة

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

استبدال المرشح الثابت بجلب البيانات من API

بدلًا من تصفية مصفوفة محلية، استدعِ نقطة نهاية API تُرجع الاقتراحات المطابقة استنادًا إلى الاستعلام. يوضع استدعاء API داخل useEffect يعتمد على قيمة الإدخال بعد تطبيق debounce. ينقل ذلك مسؤولية التصفية إلى الخادم، مما يتيح المطابقة التقريبية والترتيب وتقديم اقتراحات من مجموعة بيانات أكبر بكثير.

حالة جديدة للتحميل والأخطاء

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

تأثير الجلب

في useEffect الخاص بالجلب، استدعِ setIsLoading(true) وsetError(null) في البداية، ثم نفّذ fetch(url) وحلّل JSON واستدعِ setSuggestions(data)، وأخيرًا استدعِ setIsLoading(false) داخل كتلة finally أو بعد مساري النجاح والخطأ كليهما. يجب أن تحتوي مصفوفة تبعيات التأثير على debouncedInputValue فقط.

استخدام AbortController لإلغاء الطلبات

أنشئ AbortController جديدًا في أعلى التأثير، ومرّر controller.signal إلى خيارات الجلب. في دالة التنظيف، استدعِ controller.abort(). عندما يكتب المستخدم وتتغير القيمة بعد تطبيق debounce، يُلغى طلب الجلب السابق قبل بدء الطلب الجديد، مما يمنع وصول النتائج القديمة بترتيب غير صحيح.

التعامل مع أخطاء الإلغاء

عند إلغاء عملية جلب، تُرفض العملية مع DOMException يحمل الاسم AbortError. في كتلة catch، تحقّق من if (err.name === 'AbortError') return; لتجاهل عمليات الجلب الملغاة بصمت. تعامل فقط مع أخطاء الشبكة الفعلية أو أخطاء API التي ينبغي عرضها للمستخدم.

إدارة حالة isLoading

عيّن قيمة isLoading إلى true قبل الجلب، وإلى false بعد نجاحه أو فشله. استخدم كتلة finally لضمان إعادة ضبط القيمة دائمًا: fetch(url).then(...).catch(...).finally(() => setIsLoading(false)). من دون كتلة finally، سيؤدي فشل الجلب إلى استمرار ظهور مؤشر التحميل إلى الأبد.

مؤشر التحميل في القائمة المنسدلة

عندما تكون قيمة isLoading هي true ويحتوي حقل الإدخال على نص، اعرض القائمة المنسدلة وبداخلها مؤشر تحميل في المنتصف بدلًا من قائمة الاقتراحات. يخبر ذلك المستخدم بأن النتائج في طريقها إليه. بعد أن تصبح قيمة التحميل false وتصل الاقتراحات، استبدل مؤشر التحميل بعناصر الاقتراحات الفعلية.

حالة الخطأ في القائمة المنسدلة

عندما لا تكون قيمة error هي null، اعرض القائمة المنسدلة وبداخلها رسالة الخطأ بدلًا من الاقتراحات. وتُعد رسالة مثل "تعذر تحميل الاقتراحات. يُرجى المحاولة مرة أخرى." أكثر لطفًا من عرض سلسلة الخطأ الخام. ويمكنك اختياريًا إضافة زر لإعادة المحاولة يعيد تشغيل الجلب يدويًا.

الحد الأدنى لعدد الأحرف

تجنّب الجلب عند وجود سلاسل فارغة أو استعلامات قصيرة جدًا تنتج عددًا كبيرًا من النتائج غير الملائمة. أضف شرطًا في بداية التأثير: if (debouncedInputValue.length < 2) { setSuggestions([]); return; }. يقلل ذلك من استدعاءات API غير الضرورية ويمنع ظهور قائمة هائلة من النتائج عند إدخال حرف واحد.

تخزين النتائج التي تم جلبها مؤقتًا

خزّن النتائج التي تم جلبها في Map داخل useRef: const cache = useRef(new Map()). قبل الجلب، تحقّق من if (cache.current.has(query)) { setSuggestions(cache.current.get(query)); return; }. وبعد نجاح الجلب، خزّن النتيجة. يلغي ذلك طلبات الشبكة المتكررة للاستعلامات التي سبق للمستخدم إدخالها.

فترة debounce الموصى بها

بالنسبة إلى الإكمال التلقائي تحديدًا، تُعد فترة debounce التي تتراوح بين 200 و300 مللي ثانية الأنسب. تؤدي الفترات الأقصر (أقل من 200 مللي ثانية) إلى تشغيل عدد كبير جدًا من الطلبات لدى المستخدمين الذين يكتبون بسرعة. أما الفترات الأطول (أكثر من 400 مللي ثانية) فتجعل الاقتراحات تبدو بطيئة وغير مستجيبة. وتُستخدم مدة 250 مللي ثانية افتراضيًا بشكل شائع في تطبيقات الإكمال التلقائي المخصصة للإنتاج.

AbortController في الإكمال التلقائي

لماذا يُعد AbortController مهمًا في الإكمال التلقائي الذي يستخدم debounce لجلب البيانات من API؟

مراجعة الدرس: الاقتراحات غير المتزامنة مع debounce

استبدل التصفية الثابتة بجلب من API داخل useEffect يعتمد على القيمة بعد تطبيق debounce. استخدم AbortController لإلغاء الطلبات القديمة. أضف حالتي isLoading وerror لتزويد المستخدم بمعلومات عن العملية. عيّن حدًا أدنى لعدد الأحرف لتجنب الاستدعاءات المفرطة. وخزّن النتائج مؤقتًا في مرجع لتجاوز طلبات الشبكة المتكررة.

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

هل درس «اقتراحات غير متزامنة مع Debounce» مجاني؟

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

ماذا ستتعلم في «اقتراحات غير متزامنة مع Debounce»؟

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

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

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

كم من الوقت يستغرق درس «اقتراحات غير متزامنة مع Debounce»؟

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

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

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

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

  1. إدخال متحكَّم به مع قائمة اقتراحات
  2. التنقّل بلوحة المفاتيح في قوائم الاقتراحات
  3. اقتراحات غير متزامنة مع Debounce
  4. إتاحة الوصول لعناصر الإكمال التلقائي
← العودة إلى React Academy