نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
REA

منهج React Js

دليل مرجعي شامل

كل اللغات
مدرسة البرمجة/منهج React Js/دورة الحياة للذاكرة والوصول لعناصر الـ DOM عبر useRef

دورة الحياة للذاكرة والوصول لعناصر الـ DOM عبر useRef

جدول مرجعي سريع

1

مفاهيم دورة الحياة للذاكرة والوصول لعناصر الـ DOM عبر useRef

وجه المقارنةالمتغير عبر useStateالمتغير عبر useRef
إعادة رندرة المكون (Re-render)يؤدي كل تحديث للقيمة إلى إعادة رسم المكون فوراًلا يسبب أي إعادة رندرة للمكون نهائياً عند تغيير قيمته
الاحتفاظ بالقيمة بين الرندراتنعم يمتد عبر الرندرات المختلفةنعم يمتد ويحافظ على قيمته طوال فترة حياة المكون
وصول مباشر لعناصر الـ DOMلا (يتم التعامل مع الواجهة من خلال React Virtual DOM)نعم (يتيح إسناد مرجع مباشر لعنصر HTML حقيقي)
التعديل اللحظي (Synchronous)يتغير بحسب دورة التحديث القادمة (Asynchronous)يتغير فوراً وتكون القيمة الجديدة متاحة في السطر التالي مباشرة

الشرح

عندما نغير قيمة أي متغير معرف بـ useState، تعيد React تشغيل المكون ورسمه من جديد (Re-render). ولكن هناك حالات في الهندسة البرمجية نحتاج فيها إلى:

  1. الاحتفاظ بقيمة متغيرة بين دورات الرندرة دون التسبب في إعادة رسم الواجهة.
  2. الوصول المباشر والتحكم بعنصر HTML حقيقي في الـ DOM (مثل تركيز المؤشر داخل input أو تشغيل فيديو).

ℹ️ معلومة

هنا يأتي دور useRef، وهو عبارة عن هوك يمنحك كائناً محمولاً يحتوي على الخاصية الوحيدة current، وتستطيع تعديله بحرية كاملة دون إزعاج React بالرندرة!

1. الوصول المباشر لعناصر الـ DOM

في حالات معينة (مثل التركيز Focus، التمرير Scroll، أو قياس أبعاد عنصر)، نحتاج للتعامل مع عنصر الـ DOM مباشرة.

الشرح بالكود المختصر:

javascript
1import { useRef } from 'react';
2
3function SearchInput() {
4 const inputRef = useRef(null);
5
6 const handleFocus = () => {
7 // الوصول المباشر لعنصر الـ HTML والتركيز عليه
8 inputRef.current.focus();
9 };
10
11 return (
12 <div>
13 <input ref={inputRef} type="text" placeholder="ابحث عن كورس..." />
14 <button onClick={handleFocus}>تركيز على مربع البحث</button>
15 </div>
16 );
17}

2. تخزين القيم للذاكرة بدون إعادة رندرة (State without Re-render)

إذا أردنا تتبع قيمة ما عبر الزمن (مثل معرّف مؤقت زمني timerId أو عدد مرات الضغط لتجميع البيانات)، فإن استخدام useState سيعيد رسم الصفحة بلا داعٍ مع كل حركة.

الشرح بالكود المختصر:

javascript
1import { useState, useRef, useEffect } from 'react';
2
3function Timer() {
4 const [seconds, setSeconds] = useState(0);
5 const timerId = useRef(null); // تخزين معرّف المؤقت دون التسبب في رندرة
6
7 const startTimer = () => {
8 if (timerId.current !== null) return;
9 timerId.current = setInterval(() => {
10 setSeconds((prev) => prev + 1);
11 }, 1000);
12 };
13
14 const stopTimer = () => {
15 clearInterval(timerId.current);
16 timerId.current = null; // إعادة تصفير المرجع
17 };
18
19 return (
20 <div>
21 <h3>العداد: {seconds} ثانية</h3>
22 <button onClick={startTimer}>تشغيل</button>
23 <button onClick={stopTimer}>إيقاف</button>
24 </div>
25 );
26}

3. حساب عدد مرات رندرة المكون (Render Counter)

طريقة رائعة لتتبع كفاءة تطبيقك بدون إشعال حلقة تكرارية:

javascript
1function RenderTracker() {
2 const renderCount = useRef(1);
3
4 useEffect(() => {
5 renderCount.current += 1;
6 console.log(`تم إعادة رندرة هذا المكون ${renderCount.current} مرات`);
7 });
8
9 return <div>مكون متابعة الأداء</div>;
10}

⚠️ تحذير

تجنب تعديل واجهة المستخدم عبر الـ DOM المباشر باستخدام useRef! لا تستخدم useRef لتغيير النصوص أو الألوان أو إخفاء العناصر يدوياً بالشكل التقليدي:

javascript
1// ❌ خطأ هندسي يخل بفلسفة ريأكت
2myRef.current.style.display = 'none';

عندما تعدل الـ DOM يدوياً مباشرة بعيداً عن React Virtual DOM، تجعل React تعيش في معزل عن الوضع الحقيقي للشاشة، مما يسبب تضارباً غير متوقع في الرندرة القادمة!

نصائح احترافية

  • —اجعل useRef للقراءة أو للعمليات التفاعلية مع متصفح الـ DOM (مثل focus(), scrollIntoView(), play()) واستخدم دائماً useState لكل ما يتعلق بإظهار وتعديل عناصر الواجهة.

الدرس السابق

Building Custom Hooks

الدرس التالي

تحسين الأداء ومشاركة المعالجة عبر useMemo و useCallback

نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر