0Pricing
React Academy · درس

إدخال متحكَّم به مع قائمة اقتراحات

ابنِ الأساس: إدخال متحكَّمًا به يعرض قائمة اقتراحات منسدلة ومصفّاة أسفله

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

نظرة عامة على بنية المكوّن

يتكوّن مكوّن الإكمال التلقائي من جزأين أساسيين: حقل إدخال نصي مُدار وقائمة منسدلة باقتراحات. يوجد حقل الإدخال ضمن التدفق الطبيعي للمستند، بينما تُوضَع القائمة المنسدلة بموضع مطلق أسفله مباشرةً. ويعملان معًا كعنصر تفاعلي واحد، رغم أنهما عنصران منفصلان في DOM.

متغيرات الحالة المطلوبة

تحتاجون إلى أربعة متغيرات للحالة: inputValue (سلسلة نصية — ما تمّت كتابته)، وsuggestions (مصفوفة — العناصر المطابقة الحالية)، وisOpen (قيمة منطقية — ما إذا كانت القائمة المنسدلة مرئية)، وselectedIndex (عدد — الاقتراح المميّز للتنقل باستخدام لوحة المفاتيح، ويبدأ بالقيمة -1 عند عدم تحديد أي اقتراح).

التحكم في حقل الإدخال

اجعلوا حقل الإدخال مُدارًا بالكامل: value={inputValue} وonChange={e => setInputValue(e.target.value)}. يمنح هذا React تحكمًا كاملًا في النص المعروض. يحدّث كل ضغط على مفتاح الحالة، مما يؤدي إلى إعادة التصيير بالقيمة الجديدة. لا تستخدموا مطلقًا حقل إدخال غير مُدار للإكمال التلقائي، إذ تحتاجون إلى قراءة القيمة وتعيينها برمجيًا.

التصفية من قائمة ثابتة

عندما تأتي الاقتراحات من مصفوفة محلية، صفّوا العناصر في كل عملية تصيير استنادًا إلى inputValue: قارنوا كل عنصر باستخدام item.toLowerCase().includes(inputValue.toLowerCase()). يمكنكم حساب ذلك باستخدام useMemo إذا كانت القائمة كبيرة لتجنّب إعادة الحساب في كل إعادة تصيير. أما القوائم الصغيرة، فتكفي تصفيتها مباشرةً.

إظهار القائمة المنسدلة وإخفاؤها

افتحوا القائمة المنسدلة عندما يكون inputValue.length > 0 وsuggestions.length > 0. أغلِقوها عند فقدان حقل الإدخال التركيز، مع تأخير قصير للسماح أولًا بتسجيل النقرات على الاقتراحات، أو عند اختيار اقتراح، أو عند الضغط على مفتاح Escape. اضبطوا isOpen وفقًا لذلك للتحكم في التصيير الشرطي.

معالجة فقدان التركيز بتأخير

يُطلَق الحدث onBlur عندما يفقد حقل الإدخال التركيز، ويحدث ذلك عندما ينقر المستخدم على اقتراح. إذا أغلقتم القائمة المنسدلة فورًا عند فقدان التركيز، فلن تُسجّل النقرة على الاقتراح، لأن القائمة ستختفي قبل إطلاق حدث النقر. استخدموا setTimeout(() => setIsOpen(false), 150) لمنح النقرة وقتًا كي تُسجّل.

تنسيق القائمة المنسدلة

ضعوا القائمة المنسدلة باستخدام position: absolute حتى تتراكب فوق المحتوى الموجود أسفل حقل الإدخال بدلًا من دفعه إلى الأسفل. اضبطوا قيمة z-index مرتفعة (100 أو أكثر) لتظهر فوق المحتوى الآخر. واضبطوا max-height مع overflow-y: auto لمنع القائمة من أن تصبح طويلة جدًا عند وجود نتائج كثيرة.

جعل الاقتراحات قابلة للنقر

ينبغي أن يمتلك كل عنصر اقتراح معالج onClick: onClick={() => { setInputValue(suggestion); setIsOpen(false); }}. يعيّن هذا حقل الإدخال إلى الاقتراح المحدد ويغلق القائمة المنسدلة. ويبدو التحديد فوريًا وطبيعيًا، بما يطابق السلوك المتوقع من حقول الإكمال التلقائي.

منع فقدان التركيز قبل النقر

بديل مهلة فقدان التركيز هو استخدام onMouseDown={e => e.preventDefault()} على كل عنصر اقتراح. يمنع هذا حدث الضغط على زر الفأرة من سحب التركيز من حقل الإدخال، ولذلك لا يُطلَق حدث فقدان التركيز عند النقر على اقتراح. ويحتفظ حقل الإدخال بالتركيز، ثم يُنفّذ معالج النقر بصورة سليمة.

نظرة عامة على التفاعل باستخدام لوحة المفاتيح

يجب أن يتيح الإكمال التلقائي الجيد التنقل باستخدام لوحة المفاتيح. ينبغي أن يتمكن المستخدم من الضغط على ArrowDown لتمييز الاقتراح الأول، ومواصلة الضغط للانتقال إلى أسفل القائمة، والضغط على Enter للتحديد، والضغط على Escape للإغلاق دون تحديد. يُنفّذ ذلك من خلال معالجة onKeyDown على عنصر حقل الإدخال.

إعادة ضبط selectedIndex عند تغيير حقل الإدخال

كلما كتب المستخدم وتغيّرت قيمة inputValue، أعيدوا ضبط selectedIndex إلى -1. يمسح هذا أي تحديد سابق باستخدام لوحة المفاتيح، بحيث تبدأ مجموعة الاقتراحات المصفّاة الجديدة من دون تمييز أي عنصر. إن بقاء فهرس تحديد قديم يشير إلى عنصر مختلف بعد تغيّر القائمة أمر مربك وغير صحيح.

ترتيب حدثي Blur وMouseDown

لماذا نستخدم onMouseDown مع e.preventDefault() على عناصر الاقتراح بدلًا من الاعتماد على مهلة فقدان التركيز؟

مراجعة الدرس: حقل إدخال مُدار مع اقتراحات

تحتاج أداة الإكمال التلقائي إلى أربعة متغيرات للحالة: inputValue وsuggestions وisOpen وselectedIndex. استخدموا حقل إدخال مُدارًا، وصفّوا الاقتراحات استنادًا إلى حقل الإدخال، وأديروا ظهور القائمة المنسدلة عبر isOpen. عالجوا حالة التنافس بين فقدان التركيز والنقر قبل حدوثه باستخدام مهلة أو باستخدام onMouseDown مع preventDefault. أعيدوا ضبط selectedIndex كلما تغيّر حقل الإدخال.

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

هل درس «إدخال متحكَّم به مع قائمة اقتراحات» مجاني؟

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

ماذا ستتعلم في «إدخال متحكَّم به مع قائمة اقتراحات»؟

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

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

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

كم من الوقت يستغرق درس «إدخال متحكَّم به مع قائمة اقتراحات»؟

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

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

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

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

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