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

لماذا يتم تنفيذ الكود مرتين في رياكت

علي العبدالله

السؤال

  useEffect(() => {
    console.log("Hello World")
  }, [])

عندما اقوم بفتح الكونسل ارى انه قد كرر الجملة مرتين

 

وكذلك 

  const [name, SetName] = useState("Ali");
  useEffect(() => {
    console.log("Hello World")
}, [name])

اليس من المفترض ان يتم تنفيذ الامر عن تحديث المتغير 

لماذا يقوم بتنفيذ الامر مرتين عند تشغيل الموقع

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

تقصد في المرة الأولى عند فتح التطبيق بدون أي تحديث للحالة state أو الإعتماديات الخاصة بالخطاف useEffect؟

في حال كان الأمر كذلك، فهو بسبب وضع StrictMode وما يفعله هو 3 أشياء أثناء تطوير المشروع:

  1. يعيد عرض مكوناتك مرة أخرى Re-renders للعثور على الأخطاء الناتجة عن إعادة العرض غير النقي (التأثيرات الجانبية).
  2. يعيد تشغيل تأثيرات مكوناتك مرة أخرى للعثور على الأخطاء الناجمة عن عدم وجود دالة تنظيف مناسبة.
  3. يتحقق من مكوناتك مما إذا كان يتم استخدام واجهات برمجة التطبيقات القديمة deprecated APIs.

وبالتالي يتم طباعة الرسالة مرتين في الكونسول، ومن المفترض أن تجد ذلك الوضوع مفعل في مشروعك في ملف index.js أو app.js كالتالي:

const root = ReactDOM.createRoot(
  document.getElementById('root'),
);

root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
);

وفي حال تعطيله قم بإزالة StrictMode ليصبح الكود كالتالي:

const root = ReactDOM.createRoot(
  document.getElementById('root'),
);

root.render(
  <App />,
);

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

لا أجد أن الكود الذي لديك به مشكلة ما، يفترض أن يتم طباعة الجمل مرة واحدة ما لم يكن هنالك تأثير من خلال كود آخر.

يجب الإشارة أن خطاف useEffect يستقبل كمعامل ثان سلسلة متغيرات يتم تنفيذه كل مرة تتغير قيمة هاته المتغيرات، في مثل الحالة التي هو المعامل والمتغير name، فكل مرة يتم تصيير قيمة جديدة لـ name يتم إعادة تنفيذ الكود والنتيجة: طباعة الجملة مرتين.

أما في الحالة الأولى، فالذي يتم تمريره هو سلسلة متغيرات فارغة، بمعنى أنه لن يتم تنفيذ الكود إلا مرة واحدة وهي خلال التصيير الابتدائي initial render. 

قد لا يمكن تحديد السبب بدقة، ولكن انظر ما ان كنت تقوم بتحديث قيمة name بمكان ما بالشيفرة التي لديك.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...