جاري التحميل...
جاري التحميل...
إدارة الحالة العامة للتطبيق
Context API هو آلية تسمح لك بمشاركة البيانات بين المكونات دون تمرير الخصائص يدوياً في كل مستوى.
💡 تشبيه بسيط:
Context مثل الراديو. بدلاً من أن ترسل رسالة لكل شخص على حدة (تمرير Props)، تُبث الرسالة عبر الراديوeveryone يستمع在同一时间. أي مكون يمكنه "الاستماع" للبيانات بدون تمرير يدوي.
يحل مشكلة تنقل الخصائص (prop drilling) حيث يجب أن تمر البيانات عبر العديد من المكونات الوسيطة.
فكّر في Context كـ "حالة عامة" يمكن لأي مكون الوصول إليها.
استخدم createContext لإنشاء كائن Context جديد. يمكنك توفير قيمة افتراضية.
💡 مهم:
تُستخدم القيمة الافتراضية عندما لا يمتلك المكون مزوداً مطابقاً فوقه.
استخدم مكون Provider لتفريغ أجزاء الشجرة التي تحتاج إلى الوصول إلى السياق.
تحتوي خاصية value للمزود على البيانات المراد مشاركتها.
استخدم خطاف useContext لاستهلاك السياق في مكونات الدالة.
انقل كائن السياق إلى useContext وسيرجع القيمة الحالية.
اجمع Context مع useReducer لإدارة الحالة المعقدة، مشابهاً لـ Redux.
أي مشكلة تحل Context API؟
كيف تنشئ Context؟
كيف تستهلك Context في مكون دالة؟
ماذا تحتوي خاصية value في Provider؟
متى تُستخدم القيمة الافتراضية لـ createContext؟
أنشئ سياق سمة يسمح بالتبديل بين السمات الفاتحة والداكنة عبر التطبيق.
الحل:
// AppContext
"use client";
import { createContext, useContext, useState, useCallback } from "react";
const AppContext = createContext(undefined);
export function AppProvider({ children }) {
const [theme, setTheme] = useState("light");
const [lang, setLang] = useState("ar");
const t = useCallback((key) => {
const texts = { ar: { title: "مرحباً" }, en: { title: "Hello" } };
return texts[lang]?.[key] || key;
}, [lang]);
return (
<AppContext.Provider value={{ theme, lang, t, toggleTheme: () => setTheme(p => p === "light" ? "dark" : "light"), toggleLang: () => setLang(p => p === "ar" ? "en" : "ar") }}>
{children}
</AppContext.Provider>
);
}
export function useApp() {
const ctx = useContext(AppContext);
if (!ctx) throw new Error("useApp must be inside AppProvider");
return ctx;
}إنشاء Context:
توفير Context:
استهلاك Context:
متى تستخدم Context بدلاً من Props العادية؟
الإجابة:
عندما تحتاج لتمرير بيانات عبر العديد من مستويات المكونات.
ما هو prop drilling؟
الإجابة:
تمرير Props عبر مكونات لا تحتاجها فقط لتوصيلها بمكون أعمق.
متى لا تستخدم Context؟
الإجابة:
للحالة المتغيرة بسرعة — يسبب إعادة عرض غير ضرورية.
افصل السياقات
لا تضع كل شيء في سياق واحد. افصل بين السمة والمصادقة والترجمة.