المتجر · فصل ٣

المتجر من بره المكوّن

getState · setState · subscribe · reset
🎯 الهدف: تقرا وتكتب وتسمع من غير هوك، وترجّع الحالة الأولى.

الهوك اللي راجعه create عليه أدوات: getState و setState و getInitialState و subscribe. دول يشتغلوا في حدث، أو في اختبار، أو في موديول مش React.

outside.js
const snapshot = useCart.getState();useCart.setState({ note: "توصيل" });const stop = useCart.subscribe((state, prev) => {  console.log(prev.items.length, state.items.length);});

subscribe يرجّع دالة توقف السماع. ندهها في تنظيف useEffect لو التسجيل من مكوّن.

الأكشن مش لازم جوه المتجر. دالة في الموديول تنادي setState تتتقسم في ملف لوحدها، وتتنادي من غير هوك. النمط المعتاد لسه إن الأكشن يعيش جنب الحالة. الخارجي أنسب للتقسيم.

طلب غير متزامن

الأكشن تبقى async. بعد الرد، set يكتب. الحالة الوسطى زي التحميل حقول عادية في المتجر.

async.js
load: async () => {  set({ status: "loading" });  const res = await fetch("/api/cart");  set({ items: await res.json(), status: "ready" });},

الرجوع للأول

getInitialState هي الحالة ساعة الإنشاء، وفيها الدوال. set بيها يرجّع المتجر.

reset.js
reset: () => set(useCart.getInitialState()),

لو المتجر معمول بـ persist، الرجوع في الذاكرة مش كفاية لوحده. امسح التخزين كمان، وده في فصل الحفظ.

لو عندك كذا متجر وعايز صفرهم مع بعض، اجمع دوال الرجوع في Set ساعة create، وناديهم كلهم. كل واحدة تعمل setState بالحالة الأولى مع استبدال true عشان مفيش مفتاح قديم يفضل.

عادة Flux

مش واجهة في المكتبة. عادة: المكوّن ينادي أكشن باسم، ومش ينثر setState في كل زرار. كده تتبع التغيير يبقى من الدوال، قريب من فكرة الأكشن في Redux من غير ما تلزم بيها.

خلّصت الفصل لما

🧠 اختبر نفسك
١) عايز عدد السلة في حدث مش جوه React. تنادي إيه؟
useCart.getState و تقرا items.
٢) subscribe من غير ما توقف السماع. إيه اللي يحصل؟
الدالة تفضل تتنده بعد ما المكوّن يمشي.
٣) الرجوع للأول بياخد الحالة منين؟
getInitialState، وبعدين set. مع الاستبدال لو عايز تمسح مفاتيح زيادة.