اذهب إلى المحتوى

السؤال

نشر

حاولت إستخدام الخطاف useRef في مكون Component بسيط في مشروع React.js، بالشكل التالي:

function MyComponent() {
  const contrainerRef = useRef(null);
  console.log(contrainerRef.current);	// null

  return (
    <div ref={contrainerRef}>
      <h1>Hello, World!</h1>
    </div>
  );
}

عند تشغيل هذا المكون يتم طباعة null وليس العنصر نفسه.

لماذا يحدث هذا الأمر؟ أليس من المفترض أن يتم طباعة العنصر نفسه في الـ console؟

Recommended Posts

  • 1
نشر

عادةً ما يرجع ref React غير محدد أو فارغ "undefined" عندما نحاول الوصول إلى خاصيته الحالية قبل عرض عنصر DOM المقابل. للتتخلص من هذا ، قم بالوصول إلى ref في  useEffect hooks  أو عند تشغيل حدث.

مثال توضيحي

import {useRef, useEffect} from 'react';

export default function App() {
  const ref = useRef();

  console.log(ref.current); // undefined هنا غير معرف

  useEffect(() => {
    const el2 = ref.current;
    console.log(el2); // element here العنصر هنا 
  }, []);

  return (
    <div>
      <div ref={ref}>
        <h2>مرحبا بك في أكادمية حسوب</h2>
      </div>
    </div>
  );
}

يمكن تمرير useRef hooks () بقيمة أولية كــ"argument". يقوم hook بإرجاع كائن ref القابل للتغيير الذي تتم تهيئة الخاصية الحالية له إلى argument التي تم تمريرها.

اقتباس

لم نمرر قيمة أولية إلى useRef لذلك تم تعيين الخاصية الحالية على undefined.

إذا مررنا قيمة فارغة إلى hook ، فستكون خاصيته الحالية null إذا تم الوصول إليها على الفور.

اقتباس

استخدمنا  useEffect hooks لأننا نريد التأكد من أن ref قد تم تعيينه على العنصر وأن العنصر قد تم تحويله إلى DOM.

إذا حاولنا الوصول إلى الخاصية الحالية لـ ref مباشرة في المكون ، فسنحصل على undefined لأن ref لم يتم إعداده ولم يتم تقديم عنصر div.

import {useRef, useEffect} from 'react';

export default function App() {
  const ref = useRef();

  console.log(ref.current); // undefined هتا المرجع غير معرف

  useEffect(() => {
    const el2 = ref.current;
    console.log(el2); //  هنا العنصر
  }, []);

  const handleClick = () => {
    console.log(ref.current); //  مرجع العنصر
  };

  return (
    <div>
      <div ref={ref}>
        <h2>مرحبا بك في أكادمية حسوب</h2>
      </div>

      <button onClick={handleClick}>حسنا</button>
    </div>
  );
}

 

  • 1
نشر

في هذه الحالة أنت تحاول الوصول إلى قيمة useRef قبل أن يتم إظهار محتويات شجرة DOM أو مايعرف بـ DOM Rendering وبالتالي تحصل على القيمة null أو undefined لأنه لا وجود للعنصر div حتى يتم إسناد قيمته إلى containerRef.

إن React يقوم بإسناد قيمة .current الخاصة بالكائن ref إلى العقدة أو الوسم الملائم لها ضمن شجرة Dom في HTML وإذا حاولنا طباعة القيمة مباشرةً قبل أن يقوم المتصفح بإظهار عقد HTML سنحصل على هذا الخطأ دوماً.

لذلك يمكنك الوصول إلى القيمة من خلال استعمال useEffect كالتالي:

useEffect(()=>{
 const element = contrainerRef.current;
 console.log(element);
})

أو من خلال الأحداث events:

const handleClick = () => {
 console.log(containerRef.current);
}

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...