Zustand مكتبة الحالة Zustand

آخر تحديث: 2026-11-03

Zustand مكتبة الحالة Zustand

Zustand مكتبة حالة عامة بسيطة جدًا: تعرّف create متجرًا، وتستدعيه المكوّنات كـ Hook مخصّص، وتُشارَك الحالة عبر المكوّنات دون حاجة إلى Provider. جوهرها مجرد دالتين set وget، بلا قوالب نمطية، وهي البديل الرائج عن Redux في المشاريع الصغرى والمتوسطة حيث يكون متجر كامل بأفعال ومخفّضات ووسيطات كثرة مراسم.

المجموعةالتوجيه وإدارة الحالة
النوعمكتبة
منذ الإصدارZustand v4 / v5

ℹ️ ملاحظة يحوّل المحرّر JSX إلى JavaScript ويعرض الواجهة الحقيقية داخل بيئة معزولة؛ تُركَّب المكوّنات تلقائياً دون استدعاء render يدوي.

📝 الصيغة

import { create } from 'zustand'

const useStore = create((set, get) => ({
  count: 0,                                       // state
  inc: () => set(s => ({ count: s.count + 1 })),  // action
  reset: () => set({ count: 0 })
}))

// Inside a component (no Provider required)
const count = useStore(s => s.count)   // subscribe to a slice, update precisely
const inc = useStore(s => s.inc)

⚙️ المعاملات

selectorدالة اختيار الحالة عند استدعاء Hook المتجر، مثل s => s.count؛ وحذفها يشترك في المتجر كاملًا فتُعاد الرسمة عند أي تغيير.

القيمة المرجعة:create يُعيد Hook: استدعاؤه يُعيد قطعة الحالة المختارة؛ وset تدمج الحالة وتُطلق التحديثات في المكوّنات المشتركة، وget تقرأ الحالة الأحدث.

▶ مثال

المثال يعمل مباشرة: يُعرض تلقائياً عند التوسيع وتظهر التعديلات فوراً.

الناتج:

النقر على زر A يغيّر الرقم الذي يقرأه المكوّن B — لا يجمعهما أبٌ يمرّر props، بل مزامنة الحالة الخارجية، وهذا تمامًا ما تفعله Zustand (عرض توضيحي محاكى).

💡 النقاط الأساسية

💡 نصيحة مُحدِّد يُعيد كائنًا (s => ({ a: s.a, b: s.b })) يُنتج مرجعًا جديدًا كل مرة فيسبب رسومات زائدة؛ استخدم مقارنة ضحلة أو افصله إلى عدة استدعاءات.
ℹ️ ملاحظة تزامن وسيلة persist المتجر مع localStorage، وتُدخِل وسيلة devtools Zustand في Redux DevTools — كلاهما استيراد واحد.
⚠️ تحذير set دمج ضحل: للكائنات المتداخلة افردها بنفسك بـ set(s => ({ deep: { ...s.deep, x: 1 } }))، ولا تتوقّع دمجًا عميقًا تلقائيًا.
المزيد من الحالات قريباً.

📚 دروس ذات صلة

❓ الأسئلة الشائعة

س لماذا لا يحتاج Zustand إلى Provider؟
ج الحالة تعيش في متغيّر على مستوى الوحدة ولا تعتمد على Context؛ وتشترك فيها المكوّنات مباشرة عبر useSyncExternalStore، فتُشارَك طبيعتها عبر المكوّنات.
س كيف أحفظ الحالة؟
ج استورد { persist } من 'zustand/middleware' ولفّ المُنشئ بـ persist(fn, { name: 'key' }) داخل create؛ فيقرأ localStorage ويكتبه تلقائيًا.
س كيف أكتب فعلًا غير متزامن؟
ج الفعل مجرد دالة: fetchUser: async () => { const data = await api(); set({ user: data }) }. لا فرق بين thunks والمخفّضات.
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%