Programming Basics SQL HTML CSS JavaScript React Python C++ Java JavaFX Swing Problem Solving English English Conversations Computer Fundamentals Linux Learn Typing

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 مهما كان نوعه.

تحضير مشروع للتطبيق العملي

إفعل الخطوات التالية تباعاً حتى تنشئ مشروع جديد و تطبق فيه الأمثلة كما فعلنا بالضبط:

  1. قم بإنشاء مشروع جديد إسمه demo-app.
  2. بداخل المجلد src تجد ملف إسمه App.js قم بحذف كل الكود الإفتراضي الموجود فيه.

في هذا المشروع سنقوم فقط بالتعامل مع المكون <App>.

حساب كما مرة تم تحديث محتوى المكوّن في React

في المثال التالي، قمنا بتعريف مربع نص و تحته عنوان نعرض فيه كم مرة تم تغيير قيمة مربع النص.

أي تغيير يحصل في مربع النص سيتم تخزينه في متغير إسمه inputValue و الذي قمنا بتعريفه كــ State ليكون بالإمكان رصد أي تغيير يحصل في قيمة مربع النص و تمرير قيمته الجديدة للمتغير inputValue من خلال دالة إسمها setInputValue().

بالإضافة إلى ذلك، قمنا باستخدام الدالة useEffect() من أجل مراقبة أي تغيير يحصل في قيمة معروضة في واجهة المستخدم و التي هي فعلياً قيمة المتغير inputValue. و في حال حصول أي تغيير سيتم زيادة واحد على قيمة متغير إسمه count.

مثال

/src/App.js
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 و هكذا سنحصل على القيمة الحالية و القيمة السابقة.

مثال

/src/App.js
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 كقيمة و هكذا ربطناهما ببعض.

مثال

/src/App.js
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;
جرب الكود