تطوير ويب

تعلم React.js من الصفر - دليل شامل للمبتدئين

3 ديسمبر 2024 15 دقيقة قراءة فريق وليد سمارت
تعلم 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>
  );
}

الخطوات التالية

  1. مارس باستمرار: ابنِ مشاريع صغيرة كل يوم
  2. اقرأ الوثائق الرسمية: react.dev
  3. تعلم TypeScript: لكتابة كود أكثر أماناً
  4. جرب Next.js: لبناء تطبيقات full-stack
  5. شارك في المجتمع: GitHub, Stack Overflow

الخلاصة

React.js ليست مجرد مكتبة، بل هي طريقة تفكير جديدة في بناء واجهات المستخدم. ابدأ بالأساسيات، تدرب على المشاريع العملية، ولا تخف من الأخطاء - فكل خطأ هو فرصة للتعلم. مع الممارسة المستمرة، ستصبح مطور React محترف في وقت قصير!

شارك هذا الدليل