الـ Atoms المشتقة والـ Atoms غير المتزامنة
ركّب atoms مشتقة من atoms أخرى وأنشئ atoms غير متزامنة تتكامل مع Suspense
الـ Atoms المشتقة والـ Atoms غير المتزامنة درس مجاني في React Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
الذرات المشتقة للقراءة فقط
أنشئوا ذرة مشتقة بتمرير دالة getter: const doubleAtom = atom(get => get(countAtom) * 2). لا تخزّن هذه الذرة قيمة؛ بل تعيد حسابها كلما تغيّرت countAtom.
تظل الذرات المشتقة محدّثة دائمًا من دون أي مزامنة يدوية. وهي المكافئ في Jotai للخصائص المحسوبة.
تتبّع التبعيات تلقائيًا
يتتبّع Jotai الذرات التي جرى الوصول إليها داخل دالة getter، ويعيد تقييم الذرة المشتقة تلقائيًا عند تغيّر أيٍّ منها. ولا تحتاجون إلى التصريح بالتبعيات صراحةً.
إذا استدعت دالة getter كلًا من get(atomA) وget(atomB)، فستتحدّث الذرة المشتقة عند تغيّر atomA أو atomB.
الذرات المشتقة القابلة للكتابة
تحتوي الذرة المشتقة القابلة للكتابة على getter وsetter معًا: atom(get => get(baseAtom).toUpperCase(), (get, set, newValue) => set(baseAtom, newValue.toLowerCase())). تعطي القراءة القيمة المحوّلة، بينما تحوّل الكتابة القيمة وتخزّنها مجددًا.
يطبّق هذا النمط تحويلًا ثنائي الاتجاه للبيانات من دون كشف الذرة الأساسية مباشرةً.
الذرات غير المتزامنة باستخدام الوعود
يمكن أن تكون دالة getter غير متزامنة: const userAtom = atom(async get => { const id = get(userIdAtom); return await fetchUser(id); }). يتعامل Jotai مع الوعود الناتجة من دوال getter الخاصة بالذرات بشكل أصلي.
عند تغيّر userIdAtom، يعيد Jotai تشغيل دالة getter غير المتزامنة تلقائيًا، ويعلّق المكوّن المستهلك أثناء تنفيذ الجلب.
الذرات غير المتزامنة وReact Suspense
تتكامل الذرات غير المتزامنة بسلاسة مع React Suspense. غلّفوا المكوّن المستهلك بحدّ Suspense مع قيمة fallback. يُعلَّق المكوّن أثناء انتظار الوعد، ثم يُصيَّر عند اكتماله.
يلغي هذا الحاجة إلى إدارة حالة التحميل يدويًا في المكوّن: فلا حاجة إلى علامة isLoading ولا إلى useEffect لجلب البيانات.
loadable: تجاوز Suspense
استوردوا loadable من jotai/utils. غلّفوا ذرة غير متزامنة: const loadableUserAtom = loadable(userAtom). تتلقى المكوّنات التي تقرأ loadableUserAtom إحدى الحالات {state: 'loading'} أو {state: 'hasData', data: user} أو {state: 'hasError', error} من دون تعليق.
استخدموا loadable عندما تحتاجون إلى عرض حالة تحميل مخصصة داخل الواجهة بدلًا من الاعتماد على حدّ Suspense.
إعادة ضبط الذرات
تنشئ الأداة atomWithReset من jotai/utils ذرة يمكن إعادتها إلى قيمتها الأولية باستخدام الرمز RESET. وهذا أنظف من تتبّع القيمة الأولية وإعادة تطبيقها يدويًا.
في النماذج، أعيدوا ضبط جميع ذرات الحقول عند الإرسال أو الإلغاء باستدعاء setter لكل منها مع RESET داخل معالج واحد.
تسلسل الذرات
يمكن لذرة مشتقة القراءة من عدة ذرات أخرى: const summaryAtom = atom(get => ({ user: get(userAtom), settings: get(settingsAtom), count: get(countAtom) })). ينشئ هذا مرجعًا واحدًا مستقرًا يتحدّث عند تغيّر أي تبعية.
تشترك المكوّنات التي تحتاج إلى الملخص فقط في summaryAtom بدلًا من الاشتراك في الذرات الثلاث الفردية.
الذرات الشرطية
يمكن للذرات المشتقة قراءة ذرات مختلفة بصورة شرطية: const activeDataAtom = atom(get => get(modeAtom) === 'A' ? get(dataAAtom) : get(dataBAtom)). عند تبديل modeAtom، تبدّل الذرة المشتقة مصدر بياناتها تلقائيًا.
يعيد Jotai الاشتراك في الذرة الصحيحة عند كل تقييم، مما يضمن عدم بقاء بيانات قديمة من الفرع غير النشط.
معالجة أخطاء الذرات غير المتزامنة
إذا طرحت دالة getter الخاصة بذرة غير متزامنة خطأً أو رفضت، ينتقل الخطأ إلى أقرب حدّ لأخطاء React عند استخدامها مع Suspense. أما مع loadable، فيظهر الخطأ في الحقل state.error لمعالجته داخل الواجهة.
احرصوا دائمًا في شيفرة الإنتاج على إقران الذرات غير المتزامنة إما بـ ErrorBoundary أو بغلاف loadable.
أداء الذرات المشتقة
تخزّن الذرات المشتقة آخر نتيجة لها مؤقتًا. فإذا أعادت جميع الذرات التابعة القيم نفسها التي أعادتها في التقييم السابق، تعيد الذرة المشتقة المرجع نفسه ولا تحدث أي عمليات إعادة تصيير للمكوّنات التابعة.
بالنسبة إلى الاشتقاقات المكلفة، مثل تحويلات المصفوفات الكبيرة، يوفر هذا التخزين المؤقت فوائد كبيرة للأداء من دون أي إعداد إضافي.
تكامل الذرة غير المتزامنة مع Suspense
ماذا يحدث لمكوّن يقرأ ذرة غير متزامنة أثناء كون وعدها قيد الانتظار؟
مراجعة الدرس
تحسب الذرات المشتقة القيم من ذرات أخرى باستخدام دوال getter مع تتبّع تلقائي للتبعيات. وتستخدم الذرات غير المتزامنة دوال getter غير متزامنة، وتتكامل افتراضيًا مع React Suspense؛ استخدموا loadable من jotai/utils لتجاوز ذلك ومعالجة حالتي التحميل والخطأ داخل الواجهة.
تتيح الذرات المشتقة القابلة للكتابة إجراء تحويلات ثنائية الاتجاه، بينما تبدّل الذرات الشرطية مصادر البيانات ديناميكيًا استنادًا إلى قيم ذرات أخرى.
الأسئلة الشائعة
هل درس «الـ Atoms المشتقة والـ Atoms غير المتزامنة» مجاني؟
نعم — نص درس «الـ Atoms المشتقة والـ Atoms غير المتزامنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «الـ Atoms المشتقة والـ Atoms غير المتزامنة»؟
ركّب atoms مشتقة من atoms أخرى وأنشئ atoms غير متزامنة تتكامل مع Suspense تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الـ Atoms المشتقة والـ Atoms غير المتزامنة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Atoms: وحدة الحالة في Jotai
- قراءة Atoms وكتابتها باستخدام useAtom
- الـ Atoms المشتقة والـ Atoms غير المتزامنة
- Jotai أم Zustand أم Context: متى تستخدم كلًا منها