محتويات الدورة

React Native / ملكية العمل غير المتزامن والبيانات / الدرس 7

التأثيرات والاشتراكات وملكية الموارد

زامن مصادر الأحداث الأصلية بعقد متناظر للإعداد والتنظيف، بدلا من تنفيذ العمل أثناء العرض.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • يزامن التأثير علاقة مع نظام خارجي
  • أزل الاشتراك الذي أنشأه الإعداد نفسه
  • نمذج عمر المستمع دون اعتباره دليلا أصليا

يزامن التأثير علاقة مع نظام خارجي

يناسب التأثير Effect حالة احتياج المكوّن إلى المزامنة مع شيء خارج React، مثل اشتراك بأحداث أصلية. ولا تحتاج قيمة مشتقة من الخصائص الحالية إلى تأثير لمجرد نسخها إلى متغير حالة آخر. وينتمي فعل المستخدم المقصود إلى معالج حدثه، بدلا من تأثير يراقب علما يمثل الفعل بصورة غير مباشرة. اسأل أي مورد يُنشأ، وأي مدخلات تحدد العلاقة، ومتى تنتهي. يجعل ذلك مراجعة التنظيف ممكنة، ويتجنب عرضا يسجل مستمعا آخر كلما تغيرت تسمية غير مرتبطة.

أزل الاشتراك الذي أنشأه الإعداد نفسه

تقرأ الوحدة الأولى قيمة AppState أولية وتشترك في التغيرات اللاحقة. يوفر كائن الاشتراك المعاد remove، ويزيل التنظيف الاشتراك نفسه بالضبط. وتُمثل القيمة الأولية null بأنها unknown بدلا من اعتبارها background أو active. تصف أحداث AppState انتقالات ظهور التطبيق؛ ولا تؤكد صلاحية الحساب أو تنشئ نية مستخدم جديدة. ويظل تسليم الأحداث الأصلي واختلاف المنصات محتاجين إلى البيئة المختارة. النص المتوقع هو الحالة المقبولة التي يبلغ عنها المصدر، وليس تسلسل أحداث ثابت نَعِد به على iOS وAndroid.

jsx وحدة توضيحية من React Native؛ تتطلب بيئة التطبيق المتوافقة المبيّنة.
import {useEffect, useState} from 'react';
import {AppState, Text} from 'react-native';
export default function StatusLabel() {
  const [status, setStatus] = useState(AppState.currentState ?? 'unknown');
  useEffect(() => {
    const subscription = AppState.addEventListener('change', setStatus);
    return () => subscription.remove();
  }, []);
  return <Text>App state: {status}</Text>;
}
الناتج المتوقع
The label reflects the initial status and subsequent accepted AppState changes.

يستهدف التنظيف الاشتراك الأصلي المعاد. ولم يُنفذ مصدر أحداث أصلي أو تأثير React في بيئة التأليف.

نمذج عمر المستمع دون اعتباره دليلا أصليا

يستخدم البرنامج الثاني مصدر أحداث محليا صغيرا لتوضيح التسجيل والإزالة. بعد التنظيف لا يصل الحدث اللاحق إلى المراقب، ولا يبقى مستمع. هذا دليل مفيد على السياسة تحت Node، لكنه يتجاوز تسجيل AppState وجدولة React وتسليم الأحداث الأصلية. وقد تكون لواجهة اشتراك إنتاجية قواعد أخرى لإعادة الدخول والاستثناءات؛ فلا تنسخ هذا الناقل الصغير بديلا عاما. استخدمه بديلا محدد النتائج للتحقق من المالك الذي يربط ويفصل، ثم اختبر التكامل الفعلي مستقلا في بيئة متوافقة مصرح بها.

javascript نموذج JavaScript مستقل بمدخلات محلية مصطنعة.
function createSource() {
  const listeners = new Set();
  return {
    subscribe(listener) { listeners.add(listener); return () => listeners.delete(listener); },
    emit(value) { for (const listener of listeners) listener(value); },
    size() { return listeners.size; },
  };
}
const source = createSource();
const observed = [];
const remove = source.subscribe(value => observed.push(value));
source.emit('active');
remove();
source.emit('background');
console.log(JSON.stringify(observed));
console.log(source.size());
الناتج المتوقع
["active"]
0

يوضح البديل انتهاء الملكية عند remove. ولا يثبت توقيت الأحداث الأصلية أو سلوك دورة حياة الجهاز.

تصف الاعتماديات العلاقة، لا جدولا زمنيا مرغوبا

تشمل اعتماديات التأثير القيم التفاعلية التي يقرأها وتحدد علاقة المزامنة. قد يترك إغفال معرّف متغير مستمعا متصلا بسجل قديم. وقد يعيد كائن غير مستقر يُنشأ كل عرض إنشاء العلاقة دون حاجة. حل مشكلة الملكية بدلا من تعطيل فحوص الاعتماد أو افتراض أن المصفوفة الفارغة تعني عدم تغير الشاشة أبدا. يمكن لـ Strict Mode في التطوير فحص الإعداد والتنظيف بدورة إضافية. يجب أن يتحمل الاشتراك المتناظر الصحيح هذا الفحص؛ وقد يخفي مرجع يمنع الإعداد مع غموض التنظيف العيب الفعلي.

افحص الاستبدال والإزالة وردود النداء المتقادمة

اختبر الربط مرة واحدة، وتلقي حدث، وتغيير معرّف العلاقة، وإزالة المالك. تحقّق من عجز المصدر القديم عن تحديث الحالة الحالية بعد الاستبدال. قد تكون بعض الواجهات جدولت ردا بالفعل عند إلغاء الاشتراك؛ وعندما تسمح بذلك أضف فحص جيل أو مالك نشط عند النشر إلى جانب الفصل. أبق إلغاء المورد منفصلا عن حداثة النتيجة. يثبت عدد مستمعي البديل سياسة التنظيف المحلية، لكنه لا يعتمد كل مسار حدث أصلي. أبلغ عن تنفيذ المصدر الذي اختُبر، واترك ادعاءات دورة حياة المنصة لدليل هدف فعلي.

الأخطاء الشائعة وإصلاحها

تسبب حدث واحد في تحديثات حالة متعددة

لماذا يحدث؟
ترك الإعداد المتكرر مستمعين قدامى مرتبطين.
كيف تصلحه؟
أعد تنظيفا يزيل الاشتراك الذي أنشأه الإعداد نفسه.
كيف تتجنب تكراره؟
كرر الإعداد والتنظيف بمصدر مزيف يعد مستمعيه.

استمرار المستمع في استخدام معرّف قديم

لماذا يحدث؟
أُغفل اعتماد تفاعلي من عقد المزامنة.
كيف تصلحه؟
أدرج الاعتماد اللازم واستبدل العلاقة القديمة بأمان.
كيف تتجنب تكراره؟
غيّر المعرّفات أثناء تعليق الأحداث.

تعطيل Strict Mode لإخفاء الإعداد المكرر

لماذا يحدث؟
كشف اختبار التطوير عدم تناظر ملكية المورد.
كيف تصلحه؟
أصلح تناظر الإعداد والتنظيف قبل تغيير التشخيص.
كيف تتجنب تكراره؟
عامل الدورات المتكررة المشابهة للعرض الأول كاختبارات عمر مفيدة.

اختبر فهمك

1. هل ينبغي نسخ مجموع فرعي محسوب من الصفوف المختارة إلى الحالة بواسطة Effect؟

اعرض الحل المشروح

اشتقه عادة مباشرة من الصفوف المعتمدة. ينشئ تأثير ينسخ الحساب قيمة متغيرة أخرى يمكن أن تتأخر أو تتباعد. لا تستخدم مخزنا مؤقتا إلا إذا بررته كلفة مقاسة، ومُثلت كل الاعتماديات؛ فالمزامنة الخارجية مسؤولية مختلفة.

2. لماذا قد يحتاج إلغاء الاشتراك إلى بوابة حداثة إضافية؟

اعرض الحل المشروح

يمكن أن تكون الواجهة قد جدولت رد نداء قبل الفصل. وقد لا تسحب إزالة التسجيل المستقبلي ذلك الرد. التقط هوية العلاقة وارفض النشر إذا تغير المالك، مع إزالة المورد أيضا لإيقاف العمل اللاحق. ويجب أن يُستمد الضمان الدقيق من واجهة المصدر.

أهم ما تعلمته

  • يزامن التأثير علاقة مع نظام خارجي
  • افحص الاستبدال والإزالة وردود النداء المتقادمة

المراجع الرسمية