Kodax

Context API - إدارة الحالة العامة — مقدمة React

Context API

Context يوفر طريقة لمشاركة البيانات بين المكونات دون تمريرها يدوياً عبر كل مستوى.

متى نستخدم Context؟

- بيانات يحتاجها عدة مكونات (مثل: المستخدم، الثيم، اللغة)

- تجنب "prop drilling" - تمرير props عبر مكونات لا تحتاجها

إنشاء Context

import { createContext, useContext, useState } from 'react';

// 1. إنشاء Context
const ThemeContext = createContext();

// 2. إنشاء Provider
function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('light');
  
  const toggleTheme = () => {
    setTheme(t => t === 'light' ? 'dark' : 'light');
  };
  
  return (
    <ThemeContext.Provider value={{ theme, toggleTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}

// 3. Hook مخصص للاستخدام
function useTheme() {
  const context = useContext(ThemeContext);
  if (!context) {
    throw new Error('useTheme must be used within ThemeProvider');
  }
  return context;
}

export { ThemeProvider, useTheme };

الاستخدام

// App.jsx
function App() {
  return (
    <ThemeProvider>
      <Header />
      <Main />
      <Footer />
    </ThemeProvider>
  );
}

// Header.jsx
function Header() {
  const { theme, toggleTheme } = useTheme();
  
  return (
    <header className={`header ${theme}`}>
      <button onClick={toggleTheme}>
        تبديل الوضع
      </button>
    </header>
  );
}
import { createContext, useContext, useState } from 'react';

// Auth Context مثال
const AuthContext = createContext();

function AuthProvider({ children }) {
  const [user, setUser] = useState(null);
  
  const login = (userData) => setUser(userData);
  const logout = () => setUser(null);
  
  return (
    <AuthContext.Provider value={{ user, login, logout }}>
      {children}
    </AuthContext.Provider>
  );
}

function useAuth() {
  return useContext(AuthContext);
}

// الاستخدام في مكون
function Profile() {
  const { user, logout } = useAuth();
  
  if (!user) return <p>يرجى تسجيل الدخول</p>;
  
  return (
    <div>
      <p>مرحباً {user.name}</p>
      <button onClick={logout}>تسجيل خروج</button>
    </div>
  );
}
اختبر فهمك