تعلم React.js من الصفر - دليل شامل للمبتدئين
مقدمة
React.js هي مكتبة JavaScript قوية طورتها Facebook لبناء واجهات مستخدم تفاعلية وديناميكية. مع أكثر من 10 ملايين موقع يستخدمونها، أصبحت React المعيار الصناعي لتطوير الويب الحديث. في هذا الدليل الشامل، سنأخذك من المبتدئ إلى بناء أول تطبيق React خاص بك.
لماذا React؟
1. المكونات القابلة لإعادة الاستخدام
React تعتمد على فكرة المكونات (Components) - قطع كود صغيرة يمكن إعادة استخدامها في أي مكان:
- Button Component: استخدمه في أي صفحة
- Card Component: عرض البيانات بشكل موحد
- Navbar Component: قائمة تنقل ثابتة
2. Virtual DOM - أداء فائق
React تستخدم Virtual DOM لتحسين الأداء:
- تحديثات سريعة جداً
- استهلاك أقل للموارد
- تجربة مستخدم أكثر سلاسة
3. مجتمع ضخم وأدوات قوية
- ملايين المطورين حول العالم
- مكتبات وأدوات لا حصر لها
- دعم من Facebook وشركات عملاقة
المتطلبات الأساسية
المعرفة المطلوبة:
- HTML: فهم جيد للعناصر والبنية
- CSS: تنسيق الصفحات
- JavaScript: متغيرات، دوال، Arrays، Objects
- ES6+: Arrow Functions, Destructuring, Modules
الأدوات المطلوبة:
- Node.js: لتشغيل npm (مدير الحزم)
- Code Editor: VS Code موصى به بشدة
- المتصفح: Chrome مع React Developer Tools
إنشاء أول تطبيق React
الطريقة 1: Create React App (موصى بها للمبتدئين)
# تثبيت create-react-app عالمياً npm install -g create-react-app # إنشاء مشروع جديد npx create-react-app my-first-app # الدخول للمجلد cd my-first-app # تشغيل المشروع npm start
سيفتح المتصفح تلقائياً على http://localhost:3000 وستشاهد تطبيق React الافتراضي!
الطريقة 2: Vite (أسرع وأحدث)
npm create vite@latest my-react-app -- --template react cd my-react-app npm install npm run dev
فهم بنية المشروع
my-first-app/ ├── node_modules/ # المكتبات والحزم ├── public/ # ملفات ثابتة │ ├── index.html # صفحة HTML الرئيسية │ └── favicon.ico ├── src/ # الكود المصدري │ ├── App.js # المكون الرئيسي │ ├── index.js # نقطة الدخول │ ├── App.css # تنسيقات │ └── index.css ├── package.json # معلومات المشروع └── README.md
المفاهيم الأساسية
1. المكونات (Components)
المكونات هي قلب React. كل شيء في React هو مكون!
Function Component (الطريقة الحديثة):
function Welcome() {
return (
<div>
<h1>مرحباً بك في React!</h1>
<p>هذا أول مكون لك</p>
</div>
);
}
export default Welcome;
2. JSX - JavaScript XML
JSX يسمح لك بكتابة HTML داخل JavaScript:
function App() {
const name = "أحمد";
const age = 25;
return (
<div className="container">
<h1>اسمي {name}</h1>
<p>عمري {age} سنة</p>
<p>بعد 5 سنوات سأكون {age + 5}</p>
</div>
);
}
3. Props - تمرير البيانات
Props تسمح بتمرير البيانات من مكون لآخر:
// مكون الزر
function Button({ text, color }) {
return (
<button style={{ backgroundColor: color }}>
{text}
</button>
);
}
// استخدام المكون
function App() {
return (
<div>
<Button text="احفظ" color="blue" />
<Button text="احذف" color="red" />
<Button text="تعديل" color="green" />
</div>
);
}
State - إدارة الحالة
State هي البيانات التي تتغير مع الوقت في المكون:
useState Hook:
import { useState } from 'react';
function Counter() {
// تعريف state
const [count, setCount] = useState(0);
return (
<div>
<h1>العداد: {count}</h1>
<button onClick={() => setCount(count + 1)}>
زيادة
</button>
<button onClick={() => setCount(count - 1)}>
نقصان
</button>
<button onClick={() => setCount(0)}>
إعادة تعيين
</button>
</div>
);
}
مثال عملي - Todo List:
function TodoList() {
const [todos, setTodos] = useState([]);
const [input, setInput] = useState('');
const addTodo = () => {
if (input.trim()) {
setTodos([...todos, input]);
setInput('');
}
};
const deleteTodo = (index) => {
setTodos(todos.filter((_, i) => i !== index));
};
return (
<div>
<h1>قائمة المهام</h1>
<input
value={input}
onChange={(e) => setInput(e.target.value)}
placeholder="أضف مهمة جديدة"
/>
<button onClick={addTodo}>إضافة</button>
<ul>
{todos.map((todo, index) => (
<li key={index}>
{todo}
<button onClick={() => deleteTodo(index)}>
حذف
</button>
</li>
))}
</ul>
</div>
);
}
Hooks الأساسية
1. useEffect - للعمليات الجانبية
import { useState, useEffect } from 'react';
function DataFetcher() {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
// يتم تنفيذه عند تحميل المكون
fetch('https://api.example.com/data')
.then(res => res.json())
.then(data => {
setData(data);
setLoading(false);
});
}, []); // [] تعني تنفيذ مرة واحدة فقط
if (loading) return <p>جاري التحميل...</p>;
return (
<ul>
{data.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
}
2. useContext - مشاركة البيانات
لتمرير البيانات دون الحاجة لـ Props في كل مستوى:
import { createContext, useContext } from 'react';
const UserContext = createContext();
function App() {
return (
<UserContext.Provider value={{ name: "أحمد", role: "مطور" }}>
<Profile />
</UserContext.Provider>
);
}
function Profile() {
const user = useContext(UserContext);
return <h1>مرحباً {user.name}</h1>;
}
React Router - التنقل بين الصفحات
التثبيت:
npm install react-router-dom
الاستخدام:
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';
function App() {
return (
<BrowserRouter>
<nav>
<Link to="/">الرئيسية</Link>
<Link to="/about">من نحن</Link>
<Link to="/contact">اتصل بنا</Link>
</nav>
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/contact" element={<Contact />} />
</Routes>
</BrowserRouter>
);
}
أفضل الممارسات
تنظيم المكونات
- كل مكون في ملف منفصل
- استخدم مجلدات لتنظيم المكونات المرتبطة
- اتبع naming conventions واضحة
تحسين الأداء
- استخدم React.memo للمكونات الثابتة
- Lazy Loading للصفحات الكبيرة
- تجنب re-renders غير الضرورية
Keys في Lists
- استخدم دائماً unique keys
- تجنب استخدام index كـ key
- استخدم IDs من البيانات
State Management
- ابدأ بـ useState البسيط
- استخدم Context API للبيانات المشتركة
- Redux للتطبيقات الكبيرة فقط
مكتبات React الأساسية
للتنسيق والواجهات:
- Material-UI: مكونات جاهزة احترافية
- Tailwind CSS: utility-first CSS framework
- Styled Components: CSS-in-JS
- Ant Design: مكتبة شاملة للمؤسسات
لإدارة البيانات:
- Redux Toolkit: إدارة الحالة العامة
- React Query: إدارة البيانات من الـ API
- Zustand: بديل خفيف لـ Redux
للنماذج:
- React Hook Form: أداء عالي وسهولة
- Formik: الأكثر شهرة
- Yup: للتحقق من البيانات
مشروع عملي: تطبيق طقس
import { useState } from 'react';
function WeatherApp() {
const [city, setCity] = useState('');
const [weather, setWeather] = useState(null);
const [loading, setLoading] = useState(false);
const API_KEY = 'your_api_key';
const getWeather = async () => {
setLoading(true);
try {
const response = await fetch(
`https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${API_KEY}&units=metric&lang=ar`
);
const data = await response.json();
setWeather(data);
} catch (error) {
console.error('خطأ في جلب البيانات:', error);
}
setLoading(false);
};
return (
<div className="weather-app">
<h1>تطبيق الطقس</h1>
<div className="search">
<input
type="text"
value={city}
onChange={(e) => setCity(e.target.value)}
placeholder="أدخل اسم المدينة"
/>
<button onClick={getWeather}>بحث</button>
</div>
{loading && <p>جاري التحميل...</p>}
{weather && (
<div className="weather-info">
<h2>{weather.name}</h2>
<p>درجة الحرارة: {weather.main.temp}°C</p>
<p>الوصف: {weather.weather[0].description}</p>
<p>الرطوبة: {weather.main.humidity}%</p>
</div>
)}
</div>
);
}
الخطوات التالية
- مارس باستمرار: ابنِ مشاريع صغيرة كل يوم
- اقرأ الوثائق الرسمية: react.dev
- تعلم TypeScript: لكتابة كود أكثر أماناً
- جرب Next.js: لبناء تطبيقات full-stack
- شارك في المجتمع: GitHub, Stack Overflow
الخلاصة
React.js ليست مجرد مكتبة، بل هي طريقة تفكير جديدة في بناء واجهات المستخدم. ابدأ بالأساسيات، تدرب على المشاريع العملية، ولا تخف من الأخطاء - فكل خطأ هو فرصة للتعلم. مع الممارسة المستمرة، ستصبح مطور React محترف في وقت قصير!