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

السؤال

نشر

لدي الكود البسيط التالي:

import React from "react";

function App() {
  const [number, setNumber] = React.useState(0);

  function updateNumber() {
    setNumber(state => state + 1);
  }

  console.log("this log is showing twice");
  return (
    <div className="App">
      {number}
      <button onClick={updateNumber}>Increase Number</button>
    </div>
  );
}

ReactDOM.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>,
  document.getElementById('root')
);

 

في كل مرة اضغط فيها على الزر ، أحصل على سجلين في الـ console مما يشير إلى أن المكون يتم عرضه مرتين renders twice، لماذا يحدث هذا الأمر؟ هل هناك خطأ ما في الكود؟

Recommended Posts

  • 1
نشر

 

يتم عرض مكون App الخاص بك داخل React.StrictMode وهو ما يؤدي إلى تشغيل الدوال الخاصة بك في وضع التطوير Development Mode وفي هذا الوضع تظهر النتيجة في الـ Console مرتين لأن كل دالة يتم تشغيلها مرتين في وضع التطوير.

وحسب وثائق React الرسيمة:

اقتباس

Strict mode can’t automatically detect side effects for you, but it can help you spot them by making them a little more deterministic. This is done by intentionally double-invoking the following functions

Class component constructor, render, and shouldComponentUpdate methods -

Class component static getDerivedStateFromProps method -

Function component bodies -

State updater functions (the first argument to setState) -

Functions passed to useState, useMemo, or useReducer -

 

لا يمكن لوضع التطوير Development Mode كتشف الآثار الجانبية تلقائيًا، ولكن يمكن أن يساعدك في تحديدها بجعلها أكثر حتمية. يتم ذلك عن طريق الاستدعاء المزدوج للدوال التالية:

  • في المكون من نوع Class: 
    • constructor
    • render
    • shouldComponentUpdate
    • الدالة الثابتة getDerivedStateFromProps
  • المكونات من نوع Function:
    • جسم الدالة نفسها
    • دوال تحديث الحالة setState
    • useState
    • useMemo
    • useReducer

لاحظ أنه هذا ينطبق فقط على وضع التطوير. لن يتم استدعاء دوال Lifecycles مرتين في وضع الإنتاج.

يمكنك أن تمنع حدوث مثل هذا الأمر من خلال حذف React.StrictMode من التابع render:


ReactDOM.render(
  <App />,
  document.getElementById('root')
);

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...