0Pricing
React Academy · درس

forwardRef: إتاحة مراجع DOM للمكوّنات الأب

تعلّموا كيف يتيح forwardRef للمكوّنات الأب الوصول إلى عقدة DOM أو نسخة المكوّن الابن.

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

ما هي refs والقيد الافتراضي

الـ ref هو وسيلة للاحتفاظ بمرجع إلى عقدة DOM أو مثيل مكوّن، ويستمر هذا المرجع عبر عمليات إعادة التصيير من دون التسبب في عمليات إعادة تصيير جديدة. تسندونه باستخدام السمة ref، ثم يملأ React خاصية current فيه بعد إتمام التغييرات على DOM.

لكن لا يمكنكم إسناد ref إلى مكوّن دالة بالطريقة نفسها التي تسندونه بها إلى div. لا يملك الأب افتراضيًا مسارًا للوصول إلى عقدة DOM الموجودة داخل المكوّن الابن، لأن refs لا تُمرر مثل props العادية.

يغلّف forwardRef مكوّنًا

يتيح React.forwardRef للمكوّن استقبال ref من الأب وتمريره إلى أحد عناصره الخاصة. فهو يغلّف دالة المكوّن ويغيّر توقيعها بحيث يصل ref كمعامل ثانٍ إلى جانب props.

وهذه هي الطريقة الرسمية لإتاحة عقدة DOM داخلية لمكوّن يستدعيها، فتحوّل الابن الذي كان معتمًا من الخارج إلى مكوّن يمكن للأب الإشارة إلى عنصره مباشرة.

توقيع forwardRef

تأخذ الدالة المغلّفة معاملين: (props, ref). الأول هو كائن props المعتاد، والثاني هو ref المُمرَّر. بعد ذلك تنشرون هذا ref أو تسندونه إلى العنصر الذي تريدون إتاحته، مثل ref={ref} في input داخلي.

تذكّروا أن المكوّنات المغلّفة باستخدام forwardRef فقط هي التي تستقبل هذا المعامل الثاني. أما مكوّن الدالة العادي الذي يدرج ref كمعامل ثانٍ، فسيتلقى ببساطة القيمة undefined.

حالة استخدام: تركيز input في الابن من الأب

المثال الكلاسيكي هو مكوّن قابل لإعادة الاستخدام لحقل نصي، وتريدون أن يتمكن الأب من تركيز input الداخلي فيه. بلفّ الحقل باستخدام forwardRef وإسناد ref المُمرَّر إلى عنصر input الأساسي، يستطيع الأب استدعاء focus عليه مباشرة.

يحافظ ذلك على قابلية إعادة استخدام مكوّن الحقل، مع منح وصول إجرائي مضبوط إليه في الموضع المطلوب تمامًا، مثل تركيز الحقل الأول في نموذج عند تركيبه.

قياس عنصر في الابن

تتيح refs المُمرَّرة القياس أيضًا. إذ يمكن للأب قراءة offsetWidth وoffsetHeight، أو استدعاء getBoundingClientRect على عنصر ابن تلقاه عبر forwardRef.

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

استدعاء أساليب التمرير

بما أن ref المُمرَّر يشير إلى عقدة DOM حقيقية، يستطيع الأب استدعاء أساليب DOM الأصلية عليها. يؤدي استدعاء scrollIntoView على عنصر قائمة مُمرَّر إلى إظهاره بسلاسة، بينما يعيد scrollTo تموضع المحتوى داخل حاوية تمرير مُمرَّرة.

هذه إجراءات إجرائية لا يوجد لها مقابل تصريحي واضح، وهذا تحديدًا هو نوع التفاعل الذي صُممت refs للتعامل معه.

تمرير ref عبر طبقات متعددة

أحيانًا يكون العنصر الذي تريدون إتاحته مدفونًا داخل عدة مكوّنات. يمكنكم تسلسل forwardRef بحيث تمرر كل طبقة وسيطة ref الذي تلقته إلى الطبقة التالية، إلى أن يصل أخيرًا إلى عقدة DOM المستهدفة.

يجب أن تستخدم كل دالة تغليف في هذه السلسلة forwardRef بنفسها وأن تمرر ref إلى الأمام، لأن وجود مكوّن عادي في المنتصف سيقطع هذا الاتصال.

تركيب forwardRef مع memo

يمكن الجمع بين forwardRef وReact.memo للحصول على تمرير refs وحفظ التصيير في الذاكرة معًا. والترتيب المعتاد هو memo(forwardRef(Component))، إذ يغلّف memo ناتج forwardRef بحيث تظل مقارنة memo مطبقة.

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

عرض forwardRef في DevTools

يظهر مكوّن forwardRef في React DevTools مع تسمية ForwardRef تُغلّف اسم المكوّن. ويسهّل ذلك التأكد سريعًا من أن المكوّن يشارك في تمرير refs.

يمكنكم منح الدالة الداخلية اسمًا، أو ضبط displayName، لجعل الإدخال في DevTools أوضح من تسمية ForwardRef عامة لمكوّن مجهول.

متى لا ينبغي استخدام forwardRef

يُستخدم forwardRef لإتاحة عقد DOM وواجهات التحكم الإجرائية، لا لتمرير البيانات. إذا احتاج الأب إلى التأثير في الابن، ففضّلوا props والحالة العاديين بدلًا من الوصول إليه عبر ref.

يؤدي الإفراط في استخدام refs إلى ربط المكوّنات بإحكام وتجاوز تدفق البيانات في React، ما يجعل تتبع السلوك أصعب. استخدموا forwardRef فقط عندما يتعذر فعلًا التعبير عن التفاعل باستخدام prop تصريحي.

forwardRef في React الحديث

لا يزال forwardRef الأداة القياسية لإتاحة refs في مكتبات المكوّنات وحقول الإدخال القابلة لإعادة الاستخدام. وتتجه إصدارات React الأحدث إلى السماح بتمرير ref بوصفه prop عاديًا، لكن forwardRef لا يزال مستخدمًا على نطاق واسع ومن المهم فهمه.

يساعدكم إتقانه على التعامل مع قواعد الشيفرة الحالية، وفهم الآليات الأساسية التي ستعتمد عليها أي صياغة مستقبلية تجعل ref prop.

فحص سريع: توقيع forwardRef

اختبروا فهمكم لكيفية استقبال مكوّن forwardRef للـ ref الخاص به.

مراجعة: forwardRef

يحل forwardRef القيد الذي يمنع الأب من الوصول إلى عقدة DOM الخاصة بمكوّن الابن، وذلك بمنح المكوّن معامل ref ثانيًا يمكنه تمريره إلى عنصر داخلي. ويتيح ذلك تركيز عناصر الابن وقياسها وتمريرها.

يمكن تركيبه مع memo، وتسلسله عبر طبقات متعددة، ويظهر باسم ForwardRef في DevTools. استخدموه للوصول الإجرائي إلى DOM، لا لتمرير البيانات؛ فـ props أنسب لذلك.

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

هل درس «forwardRef: إتاحة مراجع DOM للمكوّنات الأب» مجاني؟

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

ماذا ستتعلم في «forwardRef: إتاحة مراجع DOM للمكوّنات الأب»؟

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

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

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

كم من الوقت يستغرق درس «forwardRef: إتاحة مراجع DOM للمكوّنات الأب»؟

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

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

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

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

  1. forwardRef: إتاحة مراجع DOM للمكوّنات الأب
  2. useImperativeHandle: قيم النسخة المخصصة
  3. بناء واجهة API لمكوّن حتمي
  4. متى تستخدمون واجهات API الحتمية أو التصريحية
← العودة إلى React Academy