الفرق بين المراجعتين لصفحة: «React/error boundaries»

من موسوعة حسوب
لا ملخص تعديل
لا ملخص تعديل
سطر 47: سطر 47:
<code>error</code> وهو الخطأ المرمي.
<code>error</code> وهو الخطأ المرمي.


<code>info</code> وهو كائن مع المفتاح <code>componentStack</code>. تمتلك هذه الخاصيّة معلومات حول مَكْدَس المكوّن خلال الخطأ المرمي:
<code>info</code> وهو كائن مع المفتاح <code>componentStack</code>. تمتلك هذه الخاصيّة معلومات حول مَكْدَس المكوّن خلال الخطأ المرمي:<syntaxhighlight lang="javascript">
//...
componentDidCatch(error, info) {
 
  /* مثال عن معلومات المكدس
    in ComponentThatThrows (created by App)
    in ErrorBoundary (created by App)
    in div (created by App)
    in App
  */
  logComponentStackToMyService(info.componentStack);
}
 
//...
</syntaxhighlight>
 
== تجربة حية ==
تحقق من [https://codepen.io/gaearon/pen/wqvxGa?editors=0010 هذا المثال عن تصريح واستخدام حدود الأخطاء] في [https://reactjs.org/blog/2017/09/26/react-v16.0.html React 16].
 
== أين نضع حدود الأخطاء ==
تستطيع وضع حدود الأخطاء أينما شئت. فقد تضعها في المكوّنات ذات المستوى الأعلى لعرض رسالة "حدث خطأ ما" للمستخدمين، مثلما تتعامل أُطُر عمل من طرف الخادم مع الانهيار. بإمكانك أيضًا تغليف الأدوات الذكية (widgets) ضمن حدود أخطاء لكي لا تؤدي لانهيار كامل التطبيق معها.

مراجعة 10:17، 19 أغسطس 2018

في الماضي كانت أخطاء JavaScript بداخل المكوّنات تؤدّي إلى تخريب حالة React الداخلية وإظهار أخطاء في التصييرات التالية. كانت هذه الأخطاء مُسبَّبة دومًا بخطأ باكر في شيفرة التطبيق، ولكن لم تكن تعطينا React طريقة للتعامل معها في المكوّنات، ولم يكن بإمكانها استعادتها أيضًا.

مقدمة إلى حدود الأخطاء

لا يجب أن يؤدّي خطأ JavaScript الحاصل في جزء من واجهة المستخدم إلى تعطيل كامل التطبيق. ولحل هذه المشكلة لمستخدمي React، قدّمت React في الإصدار 16 مفهومًا جديدًا وهو حد الخطأ (error boundary).

حدود الأخطاء هي مكوّنات في React والتي تلتقط أخطاء JavaScript في أي مكان من شجرة المكوّنات الأبناء لها، وتُسجِّل هذه الأخطاء، وتعرض واجهة مستخدم بديلة وذلك بدلًا من عرض شجرة المكوّنات التي انهارت. تلتقط حدود الأخطاء هذه الأخطاء خلال التصيير، وفي توابع دورة حياة المكوّن، وفي الدوال البانية لكامل الشجرة الموجودة تحتها.

ملاحظة: لا تلتقط حدود الأخطاء أخطاءً من أجل:

  • معالجات الأحداث (تعلّم المزيد).
  • الشيفرة غير المتزامنة (مثل ردود نداء setTimeout أو requestAnimationFrame).
  • التصيير من جانب الخادم.
  • الأخطاء المرميّة من قبل حد الخطأ نفسه (بدلًا من أخطاء المكوّنات الأبناء له).

تُصبِح مكوّنات الأصناف حدودًا للأخطاء إن عرّفت تابعًا جديدًا لدورة الحياة يُدعى componentDidCatch(error, info)‎:

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  componentDidCatch(error, info) {
	// عرض واجهة مستخدم بديلة
	
    this.setState({ hasError: true });
	// تستطيع تسجيل الخطأ إلى خدمة تبليغ عن الأخطاء
	
    logErrorToMyService(error, info);
  }

  render() {
    if (this.state.hasError) {
	  // تستطيع تصيير أي واجهة مستخدم بديلة مخصصة
      return <h1>حدث خطأ ما</h1>;
    }
    return this.props.children;
  }
}

بعدها تستطيع استخدامها كمكوّنات اعتياديّة:

<ErrorBoundary>
  <MyWidget />
</ErrorBoundary>

يعمل التابع componentDidCatch()‎ مثل الكتلة catch {}‎ في JavaScript، ولكن لأجل المكوّنات. تستطيع فقط مكوّنات الأصناف أن تُصبِح حدودًا للأخطاء. في الممارسة العمليّة سترغب في أغلب الأوقات في التصريح عن مكوّن لحدود الأخطاء مرّة واحدة ومن ثم استخدامه خلال تطبيقك.

لاحظ أنّ حدود الأخطاء تلتقط فقط الأخطاء في المكوّنات التي تقع تحتها في شجرة المكوّنات، فلا يستطيع التقاط خطأ موجود ضمنه. إن فشل حد الأخطاء في محاولة تصيير رسالة الخطأ فستنتشر رسالة الخطأ إلى أقرب حد خطأ موجود في المستويات الأعلى منه. وهذا يُشبِه كيفيّة عمل الكتلة catch {}‎ في JavaScript.

معاملات componentDidCatch

error وهو الخطأ المرمي.

info وهو كائن مع المفتاح componentStack. تمتلك هذه الخاصيّة معلومات حول مَكْدَس المكوّن خلال الخطأ المرمي:

//...
componentDidCatch(error, info) {

  /* مثال عن معلومات المكدس
     in ComponentThatThrows (created by App)
     in ErrorBoundary (created by App)
     in div (created by App)
     in App
  */
  logComponentStackToMyService(info.componentStack);
}

//...

تجربة حية

تحقق من هذا المثال عن تصريح واستخدام حدود الأخطاء في React 16.

أين نضع حدود الأخطاء

تستطيع وضع حدود الأخطاء أينما شئت. فقد تضعها في المكوّنات ذات المستوى الأعلى لعرض رسالة "حدث خطأ ما" للمستخدمين، مثلما تتعامل أُطُر عمل من طرف الخادم مع الانهيار. بإمكانك أيضًا تغليف الأدوات الذكية (widgets) ضمن حدود أخطاء لكي لا تؤدي لانهيار كامل التطبيق معها.