0Pricing
React Academy · درس

أفضل ممارسات Key وRef

استخدموا مفاتيح مستقرة وتجنّبوا مشكلات استخدام الفهرس كمفتاح وتعامَلوا مع callback refs

أفضل ممارسات Key وRef درس مجاني في React Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.

مرحباً

في هذا الدرس ستتعلّم كيفية استخدام مفاتيح القوائم بطريقة صحيحة، ولماذا يؤدي استخدام فهرس المصفوفة كمفتاح إلى أخطاء، وكيفية التعامل مع مراجع callback والمراجع المُمرَّرة.

لماذا تهم المفاتيح؟

يستخدم React خصائص `key` لتتبّع العناصر التي تغيّرت أو أُضيفت أو أُزيلت من القائمة بين عمليات التصيير. يتيح المفتاح الصحيح لـ React إعادة استخدام عقد DOM الموجودة، بينما يؤدي المفتاح الخاطئ إلى عمليات إلغاء تركيب وإعادة تركيب غير ضرورية.

مفاتيح ثابتة وفريدة

أفضل مفتاح هو معرّف ثابت وفريد من بياناتك، مثل معرّف صف في قاعدة بيانات أو UUID. ويجب أن يكون هذا المفتاح فريداً بين العناصر الشقيقة فقط، وليس على مستوى الصفحة بأكملها.
users.map(user => (
  <UserCard key={user.id} user={user} />
))

لماذا يسبب استخدام الفهرس كمفتاح مشكلات؟

يعمل استخدام فهرس المصفوفة كمفتاح بشكل جيد للقوائم الثابتة، لكنه يسبب أخطاءً في القوائم المرتّبة أو المصفّاة. فعندما يعاد ترتيب العناصر، يطابق React المكوّنات حسب الفهرس ويعيد استخدام عقد DOM الخاطئة، مما يفسد قيم الإدخال وحالة الرسوم المتحركة.
// Risky when list can reorder or filter
items.map((item, i) => <Row key={i} {...item} />)

متى يكون استخدام الفهرس كمفتاح مقبولاً؟

يكون استخدام الفهرس كمفتاح مقبولاً فقط عندما: (1) لا يعاد ترتيب القائمة أو تصفيتها أبداً، (2) لا تملك العناصر معرّفاً ثابتاً، و(3) لا تملك العناصر حالة محلية، مثل قيم حقول الإدخال. أما قوائم العرض الثابتة فلا مشكلة في استخدامها.

إنشاء معرّفات ثابتة

إذا لم تتضمن بياناتك معرّفاً، فأنشئ معرّفاً عند إنشاء العنصر، وليس أثناء التصيير. يمكنك استخدام `crypto.randomUUID()` أو مكتبة `nanoid`.
const newItem = { id: crypto.randomUUID(), text: 'Buy milk' };

أساسيات useRef

يعيد `useRef` كائناً قابلاً للتعديل، وتستمر قيمة `.current` فيه بين عمليات التصيير من دون التسبب في إعادة التصيير. ويُستخدم للاحتفاظ بمراجع DOM والقيم القابلة للتعديل، مثل معرّفات المؤقتات.
const inputRef = useRef(null);
<input ref={inputRef} />
// Access DOM node: inputRef.current.focus();

مراجع callback

بدلاً من تمرير كائن مرجع، يمكنك تمرير **مرجع callback** — وهو دالة يستدعيها React مع عقدة DOM عند تركيبها، ومع `null` عند إلغاء تركيبها. يتيح لك ذلك إعداد المنطق في اللحظة التي تصبح فيها العقدة متاحة تماماً.
function Input() {
  return (
    <input
      ref={node => {
        if (node) node.focus();
      }}
    />
  );
}

forwardRef لمراجع المكوّنات

لا تقبل المكوّنات الوظيفية `ref` كخاصية عادية. لفّ المكوّن باستخدام `React.forwardRef` للسماح للمكوّنات الأب بإرفاق مرجع بعقدة DOM داخلية.
const FancyInput = React.forwardRef((props, ref) => (
  <input ref={ref} className="fancy" {...props} />
));

// Parent
const inputRef = useRef(null);
<FancyInput ref={inputRef} />

useImperativeHandle

عندما يحتفظ مكوّن أب بمرجع إلى مكوّن فرعي، يمكنك التحكم بدقة فيما يكشفه باستخدام `useImperativeHandle`. يحافظ ذلك على خصوصية DOM الداخلية للمكوّن الفرعي، مع توفير واجهة imperative نظيفة.
const Child = forwardRef((_, ref) => {
  const innerRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => innerRef.current.focus(),
  }));
  return <input ref={innerRef} />;
});

تحقّق سريعاً

لماذا ينبغي تجنّب استخدام فهرس المصفوفة كمفتاح في قائمة يمكن إعادة ترتيبها؟

مراجعة

استخدم معرّفات البيانات الثابتة كمفاتيح، وتجنّب مفاتيح الفهرس في القوائم الديناميكية، واستخدم useRef للوصول إلى DOM والقيم القابلة للتعديل، واستخدم مراجع callback لمنطق التركيب وإلغاء التركيب، واستخدم forwardRef لإتاحة مراجع المكوّنات الفرعية.

التالي

الدرس التالي: **بنية المجلدات واصطلاحات التسمية** — ستنظّم مشروع React باستخدام مجلدات مبنية على الميزات وتسمية متسقة للملفات.

الأسئلة الشائعة

هل درس «أفضل ممارسات Key وRef» مجاني؟

نعم — نص درس «أفضل ممارسات Key وRef» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.

ماذا ستتعلم في «أفضل ممارسات Key وRef»؟

استخدموا مفاتيح مستقرة وتجنّبوا مشكلات استخدام الفهرس كمفتاح وتعامَلوا مع callback refs تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟

لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «أفضل ممارسات Key وRef»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟

نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. ما الذي يفعله StrictMode
  2. المكوّنات النقية وتجنّب الآثار الجانبية أثناء التصيير
  3. أفضل ممارسات Key وRef
  4. بنية المجلدات واصطلاحات التسمية
← العودة إلى React Academy