Reactالدالة useRef()
- مقدمة للدالة
useRef()
في React - تحضير مشروع للتطبيق العملي
- حساب كما مرة تم تحديث محتوى المكوّن في React
- الحصول على القيمة السابقة في React
- الوصول لعناصر واجهة المستخدم في React
مقدمة للدالة useRef()
في React
تستخدم هذه الدالة لحفظ القيم التي لا تتطلب إعادة رسم واجهة المستخدم في حال تم تحديثها.
بالإضافة إلى ذلك فإنها تستخدم أيضاً للوصول لعناصر واجهة المستخدم.
هذه الدالة هي من ضمن دوال الهووكس ( Hooks ) التي يمكن استخدامها في المكوّن المبني بأسلوب Function Component.
طريقة تضمينها
حتى تتمكن من استخدام الدالة useRef()
يجب تضمينها أولاً كما يلي.
مثال
import { useRef } from "react";
الشكل العام لاستخدامها
تستخدم هذه الدالة خارج حدود المكوّن و يتم إعطاءها قيمة أولية و إسنادها لمتغير كما يلي.
مثال
const ref = useRef(initialValue);
بعدها بداخل المكوّن يمكن يمكن الحصول على قيمة المتغير الذي تم تعريفه بواسطة هذه الدالة من خلال الخاصيّة current
كما يلي.
مثال
// ref هكذا يمكن الحصول على قيمة ref.current; // ref هكذا يمكن تحديث قيمة ref.current = someValue;
الخاصية current
تمثل كائن فيه القيمة الموجودة في ref
مهما كان نوعه.
تحضير مشروع للتطبيق العملي
إفعل الخطوات التالية تباعاً حتى تنشئ مشروع جديد و تطبق فيه الأمثلة كما فعلنا بالضبط:
- قم بإنشاء مشروع جديد إسمه
demo-app
. - بداخل المجلد
src
تجد ملف إسمهApp.js
قم بحذف كل الكود الإفتراضي الموجود فيه.
في هذا المشروع سنقوم فقط بالتعامل مع المكون <App>
.
حساب كما مرة تم تحديث محتوى المكوّن في React
في المثال التالي، قمنا بتعريف مربع نص و تحته عنوان نعرض فيه كم مرة تم تغيير قيمة مربع النص.
أي تغيير يحصل في مربع النص سيتم تخزينه في متغير إسمه inputValue
و الذي قمنا بتعريفه كــ State ليكون بالإمكان رصد أي تغيير يحصل في قيمة مربع النص و تمرير قيمته الجديدة للمتغير inputValue
من خلال دالة إسمها setInputValue()
.
بالإضافة إلى ذلك، قمنا باستخدام الدالة useEffect()
من أجل مراقبة أي تغيير يحصل في قيمة معروضة في واجهة المستخدم و التي هي فعلياً قيمة المتغير inputValue
. و في حال حصول أي تغيير سيتم زيادة واحد على قيمة متغير إسمه count
.
مثال
import { useRef, useEffect, useState } from "react"; // الذي يمثل الحاوية الرئيسية في واجهة المستخدم <App> هنا قمنا بتعريف المكون function App() { // setInputValue() قيمته الأولية نص فارغ و يمكن تحديث قيمته من خلال استدعاء دالة إسمها inputValue هنا قمنا بتعريف متغير إسمه const [inputValue, setInputValue] = useState(""); // قيمته الأولية 0 count هنا قمنا بتعريف متغير إسمه const count = useRef(0); // من أجل تنفيذ الأمر الموضوع فيها كلما تم تحديث قيمة متغير معروض useEffect() هنا قمنا باستدعاء الدالة // inputValue في واجهة المستخدم مما يعني أنه سيتم تنفيذ محتواها كلما تغيّرت القيمة الحالية في المتغير useEffect(() => { // واحداً count هنا قمنا بزيادة قيمة count.current = count.current + 1; }); // count و قد عرضنا فيه مربع نص و قيمة المتغير App هنا قمنا بتحضير ما سيتم عرضه عند تضمين المكوّن return ( <> <input type="text" value={inputValue} onChange={(e) => setInputValue(e.target.value)} /> <h1>Render Count: {count.current}</h1> </> ); } // يمكن الوصول إليه من خارج هذا الملف لأنه المكون App هنا قمنا بجعل المكون // index.html الرئيسي في الصفحة و الذي يتم تضمينه بشكل تلقائي في الملف export default App;
في حال كنت تتسائل عن سبب استخدام useRef()
بدلاً من استخدام useState()
عند حساب كم مرة تغيّرت قيمة مربع النص. فالسبب هو أن useState()
تقوم بإعادة رسم المكوّن كلما تغيير قيمة فيه و لو فعلنا ذلك لظل يتم إعادة رسمه بلا توقف!
الحصول على القيمة السابقة في React
في المثال التالي، قمنا بتعريف مربع نص و تحته عنوانين، الأول فيه قيمة مربع النص الحالية و الثاني فيه القيمة السابقة.
- القيمة الحالية سنقوم بوضعها في متغير إسمه
currentValue
و الذي يجب أن تعريفه بواسطة الدالةuseState()
حتى تتحدث قيمته في واجهة المستخدم بذات اللحظة و لربطها بمربع النص. - القيمة السابقة سنقوم بوضعها في متغير إسمه
previousValue
و الذي يجب أن تعريفه بواسطة الدالةuseRef()
لأننا نريد تحديث قيمته بشكل يدوي عندما تكون قيمة المتغيرcurrentValue
ستتغير.
لقيمة السابقة سيتم تعيينها باستخدام الدالة useEffect()
فهي ترصد التغييرات التي تحصل في قيم المكوّن مباشرةً قبل أن يتم إعادة رسمه بالقيم الجديدة، لذلك بداخلها قمنا بوضع قيمة المتغير currentValue
الحالية - مباشرةً قبل أن تتحدث - في المتغير previousValue
و هكذا سنحصل على القيمة الحالية و القيمة السابقة.
مثال
import { useRef, useEffect, useState } from "react"; // الذي يمثل الحاوية الرئيسية في واجهة المستخدم <App> هنا قمنا بتعريف المكون function App() { // setCurrentValue() قيمته الأولية نص فارغ و يمكن تحديث قيمته من خلال استدعاء دالة إسمها currentValue هنا قمنا بتعريف متغير إسمه const [currentValue, setCurrentValue] = useState(""); // قيمته الأولية نص فارغ previousValue هنا قمنا بتعريف متغير إسمه const previousValue = useRef(""); // currentValue من أجل تنفيذ الأمر الموضوع فيها كلما تم تحديث قيمة المتغير useEffect() هنا قمنا باستدعاء الدالة useEffect(() => { // واحداً count هنا قمنا بزيادة قيمة previousValue.current = currentValue; }, [currentValue]); // count و قد عرضنا فيه مربع نص و قيمة المتغير App هنا قمنا بتحضير ما سيتم عرضه عند تضمين المكوّن return ( <> <input type="text" value={currentValue} onChange={(e) => setCurrentValue(e.target.value)} /> <p>Current value: {currentValue}</p> <p>Previous value: {previousValue.current}</p> </> ); } // يمكن الوصول إليه من خارج هذا الملف لأنه المكون App هنا قمنا بجعل المكون // index.html الرئيسي في الصفحة و الذي يتم تضمينه بشكل تلقائي في الملف export default App;
إذاً في الدالة useEffect()
يمكننا الحصول على قيمة المتغير المربوط بالدالة useState()
قبل أن يتم تحديثها في واجهة المستخدم، أي يمكننا الحصول على القيمة السابقة.
الوصول لعناصر واجهة المستخدم في React
بشكل عام، عليك جعل React تتولى الوصول لعناصر واجهة المستخدم و تحديثها و لكن في بعض الحالات يمكنك استخدام الدالة useRef()
للوصول لعناصر واجهة المستخدم بدون التسبب بأي مشكلة. فمثلاً قد تكون الصفحة التي تعرضها للمستخدم فيها نموذج و الذي بدوره يحتوي بعض الحقول التي عليه أن يملأها، هنا يمكنك وضع مؤشر الماوس للمستخدم مباشرةً في الحقل الأول الموضوع في النموذج.
في المثال التالي، عند النقر على الزر سيتم وضع مؤشر الماوس بداخل مربع النص حتى يبدأ بالكتابة فيه.
لفعل ذلك، قمنا باستخدام الدالة useRef()
من أجل إنشاء كائن إسمه InputElement
يمكن من خلاله الوصول لمربع النص.
في مربع النص قمنا بإضافة الخاصية ref
له و ممرنا لها الكائن InputElement
كقيمة و هكذا ربطناهما ببعض.
مثال
import { useRef } from "react"; // الذي يمثل الحاوية الرئيسية في واجهة المستخدم <App> هنا قمنا بتعريف المكون function App() { // null قيمته الأولية inputElement هنا قمنا بتعريف متغير إسمه const inputElement = useRef(null); // عند استدعائها تقوم بوضع مؤشر focusInput() هنا قمنا بتعريف دالة إسمها // inputElement الماوس بداخل الوسم المربوط بالعنصر الذي يمثله المتغير const focusInput = () => { inputElement.current.focus(); }; // و قد عرضنا فيه مربع نص و زر App هنا قمنا بتحضير ما سيتم عرضه عند تضمين المكوّن return ( <> <input type="text" ref={inputElement} /> <button onClick={focusInput}>Focus On Input</button> </> ); } // يمكن الوصول إليه من خارج هذا الملف لأنه المكون App هنا قمنا بجعل المكون // index.html الرئيسي في الصفحة و الذي يتم تضمينه بشكل تلقائي في الملف export default App;