Zustand لحالة React خفيفة
أنشئ متجر Zustand باستخدام create()، واقرأ الحالة باستخدام الخطاف، وحدّثها باستخدام الإجراءات، واستفد من واجهة بسيطة دون شيفرة تمهيدية كثيرة.
Zustand لحالة React خفيفة درس مجاني في Frontend Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Frontend Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ما هو Zustand؟
Zustand هي مكتبة صغيرة وسريعة لإدارة الحالة في React. وواجهة برمجتها بأكملها صغيرة جدًا: أنشئ مخزنًا، واستخدم hook لقراءته وتحديثه. لا reducers ولا إجراءات ولا صياغة متكررة.
إنشاء مخزن
تعرّف create() المخزنَ الذي يضم الحالة والإجراءات في كائن عادي. والقيمة المُعادة هي hook.
import { create } from 'zustand';
interface CounterStore {
count: number;
increment: () => void;
decrement: () => void;
reset: () => void;
}
export const useCounterStore = create<CounterStore>((set) => ({
count: 0,
increment: () => set(state => ({ count: state.count + 1 })),
decrement: () => set(state => ({ count: state.count - 1 })),
reset: () => set({ count: 0 }),
}));قراءة حالة المخزن
استدعِ hook مع دالة selector للاشتراك في أجزاء محددة من الحالة. ولا يُعاد تصيير المكوّن إلا عندما يتغيّر الجزء المحدد.
function Counter() {
const count = useCounterStore(state => state.count);
return <p>Count: {count}</p>;
}قراءة الإجراءات
حدّد الإجراءات بالطريقة نفسها. فالإجراءات لا تتغيّر، لذا لا يؤدي تحديدها إلى عمليات إعادة تصيير إضافية.
function Controls() {
const { increment, decrement } = useCounterStore(
state => ({ increment: state.increment, decrement: state.decrement })
);
return (
<div>
<button onClick={increment}>+</button>
<button onClick={decrement}>-</button>
</div>
);
}تحديث الحالة باستخدام set()
تدمج الدالة set() التحديثات دمجًا سطحيًا (مثل setState في مكوّنات React الصنفية). مرّر دالة لإجراء تحديثات تعتمد على الحالة السابقة.
// Merge:
set({ loading: true });
// Function for dependent updates:
set(state => ({ count: state.count + 1 }));
// Replace entirely (replace: true):
set({ count: 0, loading: false }, true);الإجراءات غير المتزامنة
يمكن أن تكون الإجراءات في Zustand غير متزامنة — ما عليك سوى استدعاء set() بعد انتظار العملية غير المتزامنة.
export const useUsersStore = create<UsersStore>((set) => ({
users: [],
loading: false,
fetchUsers: async () => {
set({ loading: true });
const users = await fetch('/api/users').then(r => r.json());
set({ users, loading: false });
}
}));Slices — تركيب المخازن الكبيرة
قسّم المخزن الكبير إلى slices (كائنات منفصلة) ثم ادمجها. لا يتطلب نمط Zustand تجريد slice، لكنه طريقة منظمة لتنظيم المخازن الكبيرة.
Middleware: persist
تحفظ middleware المسماة persist حالة Zustand في localStorage، ثم تستعيدها عند التحميل — بإعداد محدود.
import { persist } from 'zustand/middleware';
export const useSettingsStore = create<Settings>(
persist(
(set) => ({
theme: 'light',
setTheme: (theme) => set({ theme })
}),
{ name: 'app-settings' } // localStorage key
)
);Middleware: devtools
أضف دعم Redux DevTools إلى Zustand باستخدام middleware المسماة devtools. وستحصل على تسجيل كامل للإجراءات وإمكانية التنقّل الزمني.
Zustand مقابل Redux Toolkit
Zustand: صغيرة، بلا صياغة متكررة، سريعة الإعداد، وممتازة للتطبيقات الصغيرة والمتوسطة. RTK: منظمة وقابلة للتوسع، وتوفّر أفضل DevTools، وأنسب للفرق الكبيرة. كلاهما خيار قوي — لكن بساطة Zustand هي الأفضل لمعظم التطبيقات.
Selectors والأداء
حدّد دائمًا أصغر جزء من الحالة يحتاج إليه المكوّن. يؤدي تحديد كائن الحالة بأكمله إلى إعادة التصيير عند أي تغيير في المخزن. استخدم shallow من zustand/shallow عند تحديد عدة خصائص.
import { shallow } from 'zustand/shallow';
const { theme, font } = useSettingsStore(
state => ({ theme: state.theme, font: state.font }),
shallow // compare each property shallowly
);تحقّق سريعًا
كيف تنشئ مخزن Zustand يمكن لتطبيق React بأكمله استخدامه؟
مراجعة: Zustand
تعرّف create() الحالة والإجراءات. والقيمة المُعادة هي hook. حدّد الأجزاء لتجنّب إعادة التصيير غير الضرورية. تدمج set() تحديثات الحالة. وتستدعي الإجراءات غير المتزامنة set() بعد await. استخدم middleware المسماة persist مع localStorage، وdevtools للتكامل مع Redux DevTools. لا حاجة إلى Provider.
الأسئلة الشائعة
هل درس «Zustand لحالة React خفيفة» مجاني؟
نعم — نص درس «Zustand لحالة React خفيفة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Frontend Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Frontend Academy 4 دروس في المجموع.
ماذا ستتعلم في «Zustand لحالة React خفيفة»؟
أنشئ متجر Zustand باستخدام create()، واقرأ الحالة باستخدام الخطاف، وحدّثها باستخدام الإجراءات، واستفد من واجهة بسيطة دون شيفرة تمهيدية كثيرة. تتمرن على Frontend Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Frontend Academy؟
لا تُشترط خبرة سابقة. Frontend Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «Zustand لحالة React خفيفة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Frontend Academy هذا؟
نعم. كل درس في Frontend Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Redux Toolkit: createSlice وconfigureStore
- Zustand لحالة React خفيفة
- Pinia لـ Vue: defineStore وstoreToRefs
- متى تستخدم الحالة العامة مقابل المحلية