رد فعل useRef
هوك
يسمح useRef
لك الخطاف باستمرار القيم بين عمليات العرض.
يمكن استخدامه لتخزين قيمة قابلة للتغيير لا تتسبب في إعادة تصيير عند التحديث.
يمكن استخدامه للوصول إلى عنصر DOM مباشرة.
لا يسبب إعادة تصيير
إذا حاولنا حساب عدد المرات التي يتم فيها عرض تطبيقنا باستخدام useState
الخطاف ، فسنكون عالقين في حلقة لا نهائية لأن هذا الخطاف نفسه يتسبب في إعادة تصيير.
لتجنب هذا ، يمكننا استخدام useRef
الخطاف.
مثال:
استخدم useRef
لتتبع عروض التطبيق.
import { useState, useEffect, useRef } from "react";
import ReactDOM from "react-dom";
function App() {
const [inputValue, setInputValue] = useState("");
const count = useRef(0);
useEffect(() => {
count.current = count.current + 1;
});
return (
<>
<input
type="text"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
<h1>Render Count: {count.current}</h1>
</>
);
}
ReactDOM.render(<App />, document.getElementById('root'));
useRef()
إرجاع عنصر واحد فقط. تقوم بإرجاع كائن يسمى current
.
عند التهيئة useRef
، نقوم بتعيين القيمة الأولية useRef(0)
:.
الأمر أشبه بفعل هذا const count = {current: 0}
:. يمكننا الوصول إلى العد باستخدام count.current
.
قم بتشغيل هذا على جهاز الكمبيوتر الخاص بك وحاول الكتابة في الإدخال لرؤية زيادة عدد عرض التطبيق.
الحصول على شهادة!
95 دولارًا ENROLL
الوصول إلى عناصر DOM
بشكل عام ، نريد السماح لـ React بمعالجة جميع عمليات التلاعب في DOM.
ولكن هناك بعض الحالات التي useRef
يمكن استخدامها دون التسبب في حدوث مشكلات.
في React ، يمكننا إضافة ref
سمة إلى عنصر للوصول إليه مباشرةً في DOM.
مثال:
استخدم useRef
لتركيز الإدخال:
import { useRef } from "react";
import ReactDOM from "react-dom";
function App() {
const inputElement = useRef();
const focusInput = () => {
inputElement.current.focus();
};
return (
<>
<input type="text" ref={inputElement} />
<button onClick={focusInput}>Focus Input</button>
</>
);
}
ReactDOM.render(<App />, document.getElementById('root'));
تتبع التغييرات الدولة
يمكن useRef
أيضًا استخدام الخطاف لتتبع قيم الحالة السابقة.
هذا لأننا قادرون على الحفاظ على useRef
القيم بين العروض.
مثال:
تُستخدم useRef
لتتبع قيم الحالة السابقة:
import { useState, useEffect, useRef } from "react";
import ReactDOM from "react-dom";
function App() {
const [inputValue, setInputValue] = useState("");
const previousInputValue = useRef("");
useEffect(() => {
previousInputValue.current = inputValue;
}, [inputValue]);
return (
<>
<input
type="text"
value={inputValue}
onChange={(e) => setInputValue(e.target.value)}
/>
<h2>Current Value: {inputValue}</h2>
<h2>Previous Value: {previousInputValue.current}</h2>
</>
);
}
ReactDOM.render(<App />, document.getElementById('root'));
هذه المرة نستخدم مزيجًا من useState
و useEffect
، useRef
ولتتبع الحالة السابقة.
في ال useEffect
، نقوم بتحديث useRef
القيمة الحالية في كل مرة inputValue
يتم فيها تحديثها عن طريق إدخال نص في حقل الإدخال.