React.js: الدليل الشامل لبناء واجهات المستخدم الحديثة وتطبيقات تفاعلية من الصفر في 2026

React.js: الدليل الشامل لبناء واجهات المستخدم الحديثة وتطبيقات تفاعلية من الصفر في 2026

Getting your Trinity Audio player ready... React.js: الدليل الشامل لبناء واجهات المستخدم الحديثة وتطبيقات تفاعلية من الصفر في مقتطف المقال: React.js هو المكتبة الأكثر شعبية لبناء واجهات المستخدم الحديثة. تستخدمه Facebook, Instagram, Netflix, Airbnb، وآلاف الشركات الكبرى. في هذا الدليل...

حجم الخط:
Getting your Trinity Audio player ready...

React.js: الدليل الشامل لبناء واجهات المستخدم الحديثة وتطبيقات تفاعلية من الصفر في 2026

مقتطف المقال:
React.js هو المكتبة الأكثر شعبية لبناء واجهات المستخدم الحديثة. تستخدمه Facebook, Instagram, Netflix, Airbnb، وآلاف الشركات الكبرى. في هذا الدليل الشامل، ستتعلم كيف تبني تطبيقات React احترافية من الصفر، مع أمثلة عملية ومشاريع تطبيقية.

ما هو React.js؟

React.js هو مكتبة JavaScript مفتوحة المصدر طورتها Facebook عام 2013 لبناء واجهات المستخدم التفاعلية. يعتمد على مفهوم المكونات (Components) التي يمكن إعادة استخدامها.

⚛️ Declarative: وصف الواجهة بسهولة
🧩 Component-Based: مكونات قابلة لإعادة الاستخدام
⚡ Fast: Virtual DOM للأداء العالي
🌐 Cross-Platform: React Native للتطبيقات المحمولة

💡 لماذا React؟

  • الأكثر شعبية: 40%+ من المطورين يستخدمونه
  • سوق عمل قوي: أعلى الرواتب في تطوير الويب
  • مجتمع ضخم: آلاف المكتبات والأدوات
  • سهل التعلم: مقارنة بـ Angular و Vue
  • مرن: يمكنك اختيار الأدوات التي تناسبك

إعداد بيئة التطوير

🛠️ الأدوات المطلوبة

  1. Node.js:
    • حمّل من nodejs.org
    • اختر LTS (Long Term Support)
    • تحقق من التثبيت: node --version
  2. VS Code:
    • محرر الأكواد الموصى به
    • إضافات موصى بها: ES7+ React snippets, Prettier, ESLint
  3. Git:
    • لإدارة الإصدارات
    • حمّل من git-scm.com

🚀 إنشاء مشروع React

# الطريقة 1: Vite (الموصى بها - أسرع)
npm create vite@latest my-react-app
cd my-react-app
npm install
npm run dev

# الطريقة 2: Create React App (كلاسيكية)
npx create-react-app my-react-app
cd my-react-app
npm start

# فتح المتصفح
http://localhost:5173

المفاهيم الأساسية في React

🧩 Components: المكونات

المكونات هي اللبنة الأساسية في React. كل جزء من الواجهة هو مكون مستقل.

// Functional Component (الأحدث والموصى به)
function Welcome({ name }) {
    return <h1>مرحباً، {name}!</h1>;
}

// Arrow Function Component
const Button = ({ text, onClick }) => {
    return (
        <button onClick={onClick} className="btn">
            {text}
        </button>
    );
};

// استخدام المكونات
function App() {
    return (
        <div>
            <Welcome name="أحمد" />
            <Button text="اضغط هنا" onClick={() => alert("تم!")} />
        </div>
    );
}

📝 JSX: JavaScript XML

JSX يسمح لك بكتابة HTML داخل JavaScript. هو امتداد لصيغة JavaScript.

// JSX Basics
function Card() {
    const title = "عنوان البطاقة";
    const isActive = true;
    
    return (
        <div className="card">
            {/* Expression */}
            <h2>{title}</h2>
            
            {/* Conditional Rendering */}
            {isActive && <p>نشط</p>}
            
            {/* Ternary Operator */}
            {isActive ? <span>نشط</span> : <span>غير نشط</span>}
            
            {/* List Rendering */}
            <ul>
                {["عنصر 1", "عنصر 2", "عنصر 3"].map((item, index) => (
                    <li key={index}>{item}</li>
                ))}
            </ul>
        </div>
    );
}

📦 Props: الخصائص

Props هي بيانات تمررها من مكون أب إلى مكون ابن. هي للقراءة فقط (immutable).

// Parent Component
function App() {
    return (
        <div>
            <UserCard 
                name="أحمد" 
                age={25} 
                isStudent={true}
                hobbies={["القراءة", "البرمجة"]}
            />
        </div>
    );
}

// Child Component
function UserCard({ name, age, isStudent, hobbies }) {
    return (
        <div className="user-card">
            <h2>{name}</h2>
            <p>العمر: {age}</p>
            <p>{isStudent ? "طالب" : "ليس طالباً"}</p>
            <ul>
                {hobbies.map((hobby, i) => (
                    <li key={i}>{hobby}</li>
                ))}
            </ul>
        </div>
    );
}

// Default Props
UserCard.defaultProps = {
    age: 18,
    isStudent: false
};

// PropTypes (Type Checking)
import PropTypes from 'prop-types';

UserCard.propTypes = {
    name: PropTypes.string.isRequired,
    age: PropTypes.number,
    isStudent: PropTypes.bool,
    hobbies: PropTypes.arrayOf(PropTypes.string)
};

Hooks: الحالة والتأثيرات

🔄 useState: إدارة الحالة

useState يسمح لك بإضافة حالة (state) للمكونات الوظيفية.

import { useState } from 'react';

function Counter() {
    // Basic useState
    const [count, setCount] = useState(0);
    
    // Object state
    const [user, setUser] = useState({
        name: "أحمد",
        age: 25
    });
    
    // Array state
    const [items, setItems] = useState([]);
    
    return (
        <div>
            <p>العداد: {count}</p>
            <button onClick={() => setCount(count + 1)}>
                زيادة
            </button>
            <button onClick={() => setCount(count - 1)}>
                نقصان
            </button>
            <button onClick={() => setCount(0)}>
                إعادة تعيين
            </button>
            
            <hr />
            
            <p>الاسم: {user.name}</p>
            <button onClick={() => setUser({ ...user, age: user.age + 1 })}>
                زيادة العمر
            </button>
        </div>
    );
}

function TodoList() {
    const [todos, setTodos] = useState([]);
    const [input, setInput] = useState("");
    
    const addTodo = () => {
        if (input.trim()) {
            setTodos([...todos, { id: Date.now(), text: input, done: false }]);
            setInput("");
        }
    };
    
    const toggleTodo = (id) => {
        setTodos(todos.map(todo => 
            todo.id === id ? { ...todo, done: !todo.done } : todo
        ));
    };
    
    const deleteTodo = (id) => {
        setTodos(todos.filter(todo => todo.id !== id));
    };
    
    return (
        <div>
            <input 
                value={input}
                onChange={(e) => setInput(e.target.value)}
                placeholder="أضف مهمة جديدة"
            />
            <button onClick={addTodo}>إضافة</button>
            
            <ul>
                {todos.map(todo => (
                    <li key={todo.id} style={{ textDecoration: todo.done ? 'line-through' : 'none' }}>
                        {todo.text}
                        <button onClick={() => toggleTodo(todo.id)}>✓</button>
                        <button onClick={() => deleteTodo(todo.id)}>✗</button>
                    </li>
                ))}
            </ul>
        </div>
    );
}

⚡ useEffect: التأثيرات الجانبية

useEffect يسمح لك بتنفيذ كود بعد render المكون (API calls, subscriptions, DOM manipulation).

import { useState, useEffect } from 'react';

function DataFetcher() {
    const [data, setData] = useState([]);
    const [loading, setLoading] = useState(true);
    const [error, setError] = useState(null);
    
    // Fetch data on component mount
    useEffect(() => {
        const fetchData = async () => {
            try {
                const response = await fetch('https://api.example.com/data');
                if (!response.ok) throw new Error('Failed to fetch');
                const result = await response.json();
                setData(result);
            } catch (err) {
                setError(err.message);
            } finally {
                setLoading(false);
            }
        };
        
        fetchData();
    }, []); // Empty array = run once on mount
    
    if (loading) return <p>جاري التحميل...</p>;
    if (error) return <p>خطأ: {error}</p>;
    
    return (
        <ul>
            {data.map(item => (
                <li key={item.id}>{item.name}</li>
            ))}
        </ul>
    );
}

// Effect with cleanup
function Timer() {
    const [seconds, setSeconds] = useState(0);
    
    useEffect(() => {
        const interval = setInterval(() => {
            setSeconds(s => s + 1);
        }, 1000);
        
        // Cleanup function
        return () => clearInterval(interval);
    }, []);
    
    return <p>الوقت: {seconds} ثانية</p>;
}

// Effect with dependency
function SearchComponent() {
    const [query, setQuery] = useState("");
    const [results, setResults] = useState([]);
    
    useEffect(() => {
        if (query.length > 2) {
            const timer = setTimeout(async () => {
                const res = await fetch(`/api/search?q=${query}`);
                const data = await res.json();
                setResults(data);
            }, 500); // Debounce
            
            return () => clearTimeout(timer);
        }
    }, [query]); // Run when query changes
    
    return (
        <div>
            <input 
                value={query}
                onChange={(e) => setQuery(e.target.value)}
                placeholder="ابحث..."
            />
            <ul>
                {results.map(item => <li key={item.id}>{item.name}</li>)}
            </ul>
        </div>
    );
}

🌐 useContext: السياق العام

useContext يسمح لك بمشاركة البيانات بين المكونات بدون تمرير props يدوياً.

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

// Create Context
const ThemeContext = createContext();

// Provider Component
function ThemeProvider({ children }) {
    const [theme, setTheme] = useState('light');
    
    const toggleTheme = () => {
        setTheme(theme === 'light' ? 'dark' : 'light');
    };
    
    return (
        <ThemeContext.Provider value={{ theme, toggleTheme }}>
            {children}
        </ThemeContext.Provider>
    );
}

// Consumer Component
function ThemedButton() {
    const { theme, toggleTheme } = useContext(ThemeContext);
    
    return (
        <button 
            onClick={toggleTheme}
            style={{
                background: theme === 'light' ? '#fff' : '#333',
                color: theme === 'light' ? '#333' : '#fff'
            }}
        >
            تبديل الثيم (الحالي: {theme})
        </button>
    );
}

// App Component
function App() {
    return (
        <ThemeProvider>
            <div>
                <h1>تطبيق مع ثيم</h1>
                <ThemedButton />
            </div>
        </ThemeProvider>
    );
}

React Router: التنقل بين الصفحات

🛣️ إعداد React Router

# تثبيت React Router
npm install react-router-dom

// App.jsx
import { BrowserRouter, Routes, Route, Link, useParams, useNavigate } from 'react-router-dom';

// Home Page
function Home() {
    return <h1>الصفحة الرئيسية</h1>;
}

// About Page
function About() {
    return <h1>عن الموقع</h1>;
}

// Product Page with Dynamic Route
function Product() {
    const { id } = useParams();
    const navigate = useNavigate();
    
    return (
        <div>
            <h1>منتج رقم: {id}</h1>
            <button onClick={() => navigate('/')}>العودة للرئيسية</button>
        </div>
    );
}

// 404 Page
function NotFound() {
    return <h1>404 - الصفحة غير موجودة</h1>;
}

// Navigation Component
function Navigation() {
    return (
        <nav>
            <Link to="/">الرئيسية</Link>
            <Link to="/about">عن الموقع</Link>
            <Link to="/product/1">منتج 1</Link>
            <Link to="/product/2">منتج 2</Link>
        </nav>
    );
}

// App Component with Router
function App() {
    return (
        <BrowserRouter>
            <Navigation />
            <Routes>
                <Route path="/" element={<Home />} />
                <Route path="/about" element={<About />} />
                <Route path="/product/:id" element={<Product />} />
                <Route path="*" element={<NotFound />} />
            </Routes>
        </BrowserRouter>
    );
}

export default App;

إدارة الحالة المتقدمة

📦 Redux Toolkit: إدارة حالة شاملة

# تثبيت Redux Toolkit
npm install @reduxjs/toolkit react-redux

// store.js
import { configureStore, createSlice } from '@reduxjs/toolkit';

// Create Slice
const counterSlice = createSlice({
    name: 'counter',
    initialState: { value: 0 },
    reducers: {
        increment: (state) => {
            state.value += 1;
        },
        decrement: (state) => {
            state.value -= 1;
        },
        incrementByAmount: (state, action) => {
            state.value += action.payload;
        }
    }
});

// Export Actions
export const { increment, decrement, incrementByAmount } = counterSlice.actions;

// Configure Store
const store = configureStore({
    reducer: {
        counter: counterSlice.reducer
    }
});

export default store;

// index.js
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux';
import store from './store';
import App from './App';

ReactDOM.createRoot(document.getElementById('root')).render(
    <Provider store={store}>
        <App />
    </Provider>
);

// Counter Component
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement, incrementByAmount } from './store';

function Counter() {
    const count = useSelector((state) => state.counter.value);
    const dispatch = useDispatch();
    
    return (
        <div>
            <h1>العداد: {count}</h1>
            <button onClick={() => dispatch(increment())}>+</button>
            <button onClick={() => dispatch(decrement())}>-</button>
            <button onClick={() => dispatch(incrementByAmount(5))}>+5</button>
        </div>
    );
}

مشروع تطبيقي: تطبيق قائمة المهام

// TodoApp.jsx - تطبيق قائمة مهام كامل
import { useState, useEffect } from 'react';

function TodoApp() {
    const [todos, setTodos] = useState(() => {
        // Load from localStorage
        const saved = localStorage.getItem('todos');
        return saved ? JSON.parse(saved) : [];
    });
    const [input, setInput] = useState("");
    const [filter, setFilter] = useState('all');
    
    // Save to localStorage
    useEffect(() => {
        localStorage.setItem('todos', JSON.stringify(todos));
    }, [todos]);
    
    const addTodo = () => {
        if (input.trim()) {
            setTodos([...todos, {
                id: Date.now(),
                text: input,
                completed: false,
                createdAt: new Date().toISOString()
            }]);
            setInput("");
        }
    };
    
    const toggleTodo = (id) => {
        setTodos(todos.map(todo => 
            todo.id === id ? { ...todo, completed: !todo.completed } : todo
        ));
    };
    
    const deleteTodo = (id) => {
        setTodos(todos.filter(todo => todo.id !== id));
    };
    
    const clearCompleted = () => {
        setTodos(todos.filter(todo => !todo.completed));
    };
    
    // Filter todos
    const filteredTodos = todos.filter(todo => {
        if (filter === 'active') return !todo.completed;
        if (filter === 'completed') return todo.completed;
        return true;
    });
    
    const itemsLeft = todos.filter(todo => !todo.completed).length;
    
    return (
        <div style={{ maxWidth: '500px', margin: '50px auto', padding: '20px' }}>
            <h1>📝 قائمة المهام</h1>
            
            {/* Input */}
            <div style={{ display: 'flex', gap: '10px', marginBottom: '20px' }}>
                <input 
                    type="text"
                    value={input}
                    onChange={(e) => setInput(e.target.value)}
                    onKeyPress={(e) => e.key === 'Enter' && addTodo()}
                    placeholder="أضف مهمة جديدة..."
                    style={{ flex: 1, padding: '10px', fontSize: '16px' }}
                />
                <button onClick={addTodo} style={{ padding: '10px 20px' }}>
                    إضافة
                </button>
            </div>
            
            {/* Filters */}
            <div style={{ marginBottom: '20px' }}>
                <button onClick={() => setFilter('all')}>الكل</button>
                <button onClick={() => setFilter('active')}>النشطة</button>
                <button onClick={() => setFilter('completed')}>المكتملة</button>
                <button onClick={clearCompleted}>مسح المكتملة</button>
            </div>
            
            {/* Todo List */}
            <ul style={{ listStyle: 'none', padding: 0 }}>
                {filteredTodos.map(todo => (
                    <li 
                        key={todo.id}
                        style={{
                            display: 'flex',
                            alignItems: 'center',
                            padding: '10px',
                            marginBottom: '10px',
                            background: '#f5f5f5',
                            borderRadius: '5px'
                        }}
                    >
                        <input 
                            type="checkbox"
                            checked={todo.completed}
                            onChange={() => toggleTodo(todo.id)}
                            style={{ marginRight: '10px' }}
                        />
                        <span style={{ 
                            flex: 1,
                            textDecoration: todo.completed ? 'line-through' : 'none',
                            color: todo.completed ? '#999' : '#333'
                        }}>
                            {todo.text}
                        </span>
                        <button 
                            onClick={() => deleteTodo(todo.id)}
                            style={{ background: '#ff4444', color: 'white', border: 'none', padding: '5px 10px', cursor: 'pointer' }}
                        >
                            حذف
                        </button>
                    </li>
                ))}
            </ul>
            
            {/* Footer */}
            <p style={{ textAlign: 'center', color: '#666' }}>
                {itemsLeft} {itemsLeft === 1 ? 'عنصر متبقي' : 'عناصر متبقية'}
            </p>
        </div>
    );
}

export default TodoApp;

أفضل الممارسات في React

✅ أفضل الممارسات

  1. استخدم Functional Components:
    • أسهل في القراءة والاختبار
    • استخدم Hooks بدلاً من Class Components
  2. Components صغيرة:
    • كل مكون يجب أن يفعل شيئاً واحداً
    • قسم الواجهة إلى مكونات صغيرة قابلة لإعادة الاستخدام
  3. استخدم Keys في القوائم:
    • استخدم معرفات فريدة (ليس index)
    • يحسن الأداء ويمنع الأخطاء
  4. Lazy Loading:
    • استخدم React.lazy و Suspense
    • حمّل المكونات عند الحاجة فقط
  5. Memoization:
    • استخدم useMemo و useCallback
    • يمنع إعادة الحساب غير الضرورية

❌ أخطاء شائعة

  • تعديل State مباشرة: استخدم setState أو dispatch
  • استخدام index كـ key: استخدم معرفات فريدة
  • Components كبيرة جداً: قسمها إلى مكونات صغيرة
  • عدم استخدام Keys: يؤدي لأخطاء في القوائم
  • تأثيرات جانبية في render: استخدم useEffect
  • عدم تنظيف التأثيرات: أعد cleanup في useEffect
  • Prop Drilling: استخدم Context بدلاً من تمرير props عميقاً
  • عدم Memoization: يؤدي لإعادة render غير ضرورية

أدوات ومكتبات React

🛠️ المكتبات الأساسية

المكتبة الوظيفة التكلفة
React Router التنقل بين الصفحات مجاني
Redux Toolkit إدارة الحالة مجاني
TanStack Query إدارة البيانات من APIs مجاني
Formik إدارة النماذج مجاني
React Hook Form نماذج خفيفة وسريعة مجاني
Framer Motion الرسوم المتحركة مجاني
React Query Data Fetching مجاني
Zustand State Management خفيف مجاني

موارد التعلم

📚 أفضل مصادر تعلم React

  1. React Official Docs:
    • react.dev
    • التوثيق الرسمي الحديث
    • أمثلة تفاعلية
  2. freeCodeCamp:
    • دورة React مجانية
    • شهادة معتمدة
    • مشاريع عملية
  3. YouTube Channels:
    • Traversy Media
    • Web Dev Simplified
    • The Net Ninja
    • Fireship
  4. دورات مدفوعة:
    • Udemy: React – The Complete Guide
    • Frontend Masters
    • Epic React by Kent C. Dodds

مؤسسة الصقر للتسويق الرقمي وخدمات React

هل تريد تعلم React.js بشكل احترافي؟ فريقنا المتخصص في مؤسسة الصقر يقدم دورات تدريبية شاملة في React، مع مشاريع عملية وتوجيه مباشر من محترفين.

خبرتنا تمتد لأكثر من 10 سنوات في تطوير تطبيقات React، وساعدنا مئات المتدربين على دخول عالم البرمجة بنجاح.

اطلب استشارة تعلم React مجانية

الخلاصة

React.js هو المكتبة الأقوى لبناء واجهات المستخدم الحديثة. تعلمه يفتح لك أبواب سوق العمل ويمنحك مهارات قيّمة.

القاعدة الذهبية: ابدأ بالأساسيات (Components, Props, State)، ثم انتقل للمواضيع المتقدمة (Hooks, Router, State Management). التطبيق العملي هو المفتاح.

تذكر: React سهل التعلم لكن يحتاج ممارسة. ابنِ مشاريع حقيقية، اقرأ كود الآخرين، وشارك في المجتمع.

سواء كنت مبتدئاً أو محترفاً، React سيحدث فرقاً كبيراً في مسيرتك المهنية. ابدأ اليوم، وستحصد ثماراً استثنائية غداً.

الأسئلة الشائعة (FAQ)

هل React صعب التعلم؟
+
لا! React سهل التعلم إذا كنت تعرف أساسيات JavaScript. المفاهيم الأساسية (Components, Props, State) بسيطة. الصعوبة تأتي في المواضيع المتقدمة (Hooks المعقدة، Performance Optimization).
كم من الوقت يستغرق تعلم React؟
+
الأساسيات: 2-4 أسابيع. المستوى المتوسط: 2-3 أشهر. المستوى المتقدم: 4-6 أشهر. مع الممارسة اليومية، يمكنك بناء مشاريع حقيقية في شهرين.
هل أحتاج تعلم Redux؟
+
ليس دائماً. للمشاريع الصغيرة والمتوسطة، useState و useContext كافيان. للمشاريع الكبيرة والمعقدة، Redux Toolkit مفيد. بدائل أخف: Zustand, Jotai, Recoil.
ما الفرق بين React و React Native؟
+
React: لبناء تطبيقات الويب (تعمل في المتصفح). React Native: لبناء تطبيقات الجوال (iOS و Android). نفس المفاهيم، لكن React Native يستخدم مكونات أصلية للجوال.
هل React أفضل من Vue و Angular؟
+
لا يوجد “أفضل” مطلق. React: الأكثر شعبية، مرن، مجتمع كبير. Vue: أسهل في التعلم، أصغر حجماً. Angular: شامل، مناسب للمشاريع الكبيرة. اختر حسب احتياجاتك.
هل أحتاج TypeScript مع React؟
+
ليس ضرورياً، لكن موصى به. TypeScript يضيف type checking، يمنع أخطاء كثيرة، ويحسن جودة الكود. معظم المشاريع الحديثة تستخدم TypeScript. تعلمه بعد إتقان JavaScript.
ما هي Next.js ولماذا أحتاجها؟
+
Next.js هو framework مبني على React يضيف: SSR (Server-Side Rendering)، SSG (Static Site Generation)، API Routes، Image Optimization. مفيد لـ SEO والأداء.
كيف أتحسن في React؟
+
(1) ابنِ مشاريع حقيقية، (2) اقرأ كود المشاريع المفتوحة المصدر، (3) تعلم من الأخطاء، (4) شارك في المجتمع، (5) تابع التطورات، (6) تعلم TypeScript، (7) اختبر كودك (Jest, React Testing Library).
هل سوق العمل لـ React جيد؟
+
ممتاز! React هو الأكثر طلباً في سوق العمل. الرواتب عالية، والفرص كثيرة. الشركات الكبرى (Facebook, Netflix, Airbnb) تستخدم React. حتى في السعودية، الطلب على مطوري React في نمو مستمر.
ما هي أفضل المشاريع للتدريب؟
+
(1) Todo List، (2) Weather App، (3) E-commerce Store، (4) Blog Platform، (5) Social Media Dashboard، (6) Chat Application، (7) Movie Database (TMDB API). ابدأ بالبسيط وتدرج.


فريق محتوى الصقر

فريق متخصص في تقديم محتوى عالي الجودة يركز على التسويق الرقمي وتطوير الأعمال. نسعى لتقديم معلومات قيمة ومفيدة تساعدك على تحقيق أهدافك.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *