Reactالدالة useRef()
- مقدمة للدالة
useRef() في React - تحضير مشروع للتطبيق العملي
- حساب كما مرة تم تحديث محتوى المكوّن في React
- الحصول على القيمة السابقة في React
- الوصول لعناصر واجهة المستخدم في React
مقدمة للدالة useRef() في React
تستخدم هذه الدالة لحفظ القيم التي لا تتطلب إعادة رسم واجهة المستخدم في حال تم تحديثها.
بالإضافة إلى ذلك فإنها تستخدم أيضاً للوصول لعناصر واجهة المستخدم.
هذه الدالة هي من ضمن دوال الهووكس ( Hooks ) التي يمكن استخدامها في المكوّن المبني بأسلوب Function Component.
طريقة تضمينها
حتى تتمكن من استخدام الدالة useRef() يجب تضمينها أولاً كما يلي.
الشكل العام لاستخدامها
تستخدم هذه الدالة خارج حدود المكوّن و يتم إعطاءها قيمة أولية و إسنادها لمتغير كما يلي.
بعدها بداخل المكوّن يمكن يمكن الحصول على قيمة المتغير الذي تم تعريفه بواسطة هذه الدالة من خلال الخاصيّة current كما يلي.
الخاصية current تمثل كائن فيه القيمة الموجودة في ref مهما كان نوعه.
تحضير مشروع للتطبيق العملي
إفعل الخطوات التالية تباعاً حتى تنشئ مشروع جديد و تطبق فيه الأمثلة كما فعلنا بالضبط:
- قم بإنشاء مشروع جديد إسمه
demo-app.
- بداخل المجلد
src تجد ملف إسمه App.js قم بحذف كل الكود الإفتراضي الموجود فيه.
في هذا المشروع سنقوم فقط بالتعامل مع المكون <App>.
حساب كما مرة تم تحديث محتوى المكوّن في React
في المثال التالي، قمنا بتعريف مربع نص و تحته عنوان نعرض فيه كم مرة تم تغيير قيمة مربع النص.
أي تغيير يحصل في مربع النص سيتم تخزينه في متغير إسمه inputValue و الذي قمنا بتعريفه كــ State ليكون بالإمكان رصد أي تغيير يحصل في قيمة مربع النص و تمرير قيمته الجديدة للمتغير inputValue من خلال دالة إسمها setInputValue().
بالإضافة إلى ذلك، قمنا باستخدام الدالة useEffect() من أجل مراقبة أي تغيير يحصل في قيمة معروضة في واجهة المستخدم و التي هي فعلياً قيمة المتغير inputValue. و في حال حصول أي تغيير سيتم زيادة واحد على قيمة متغير إسمه count.
في حال كنت تتسائل عن سبب استخدام useRef() بدلاً من استخدام useState() عند حساب كم مرة تغيّرت قيمة مربع النص. فالسبب هو أن useState() تقوم بإعادة رسم المكوّن كلما تغيير قيمة فيه و لو فعلنا ذلك لظل يتم إعادة رسمه بلا توقف!
الحصول على القيمة السابقة في React
في المثال التالي، قمنا بتعريف مربع نص و تحته عنوانين، الأول فيه قيمة مربع النص الحالية و الثاني فيه القيمة السابقة.
- القيمة الحالية سنقوم بوضعها في متغير إسمه
currentValue و الذي يجب أن تعريفه بواسطة الدالة useState() حتى تتحدث قيمته في واجهة المستخدم بذات اللحظة و لربطها بمربع النص.
- القيمة السابقة سنقوم بوضعها في متغير إسمه
previousValue و الذي يجب أن تعريفه بواسطة الدالة useRef() لأننا نريد تحديث قيمته بشكل يدوي عندما تكون قيمة المتغير currentValue ستتغير.
لقيمة السابقة سيتم تعيينها باستخدام الدالة useEffect() فهي ترصد التغييرات التي تحصل في قيم المكوّن مباشرةً قبل أن يتم إعادة رسمه بالقيم الجديدة، لذلك بداخلها قمنا بوضع قيمة المتغير currentValue الحالية - مباشرةً قبل أن تتحدث - في المتغير previousValue و هكذا سنحصل على القيمة الحالية و القيمة السابقة.
إذاً في الدالة useEffect() يمكننا الحصول على قيمة المتغير المربوط بالدالة useState() قبل أن يتم تحديثها في واجهة المستخدم، أي يمكننا الحصول على القيمة السابقة.
الوصول لعناصر واجهة المستخدم في React
بشكل عام، عليك جعل React تتولى الوصول لعناصر واجهة المستخدم و تحديثها و لكن في بعض الحالات يمكنك استخدام الدالة useRef() للوصول لعناصر واجهة المستخدم بدون التسبب بأي مشكلة. فمثلاً قد تكون الصفحة التي تعرضها للمستخدم فيها نموذج و الذي بدوره يحتوي بعض الحقول التي عليه أن يملأها، هنا يمكنك وضع مؤشر الماوس للمستخدم مباشرةً في الحقل الأول الموضوع في النموذج.
في المثال التالي، عند النقر على الزر سيتم وضع مؤشر الماوس بداخل مربع النص حتى يبدأ بالكتابة فيه.
لفعل ذلك، قمنا باستخدام الدالة useRef() من أجل إنشاء كائن إسمه InputElement يمكن من خلاله الوصول لمربع النص.
في مربع النص قمنا بإضافة الخاصية ref له و ممرنا لها الكائن InputElement كقيمة و هكذا ربطناهما ببعض.