آموزش ری اکت (React) – ساخت اپلیکیشن تک صفحه‌ای با قدرتمندترین فریمورک فرانت‌اند

آموزش ری اکت (React) – ساخت اپلیکیشن تک صفحه‌ای با قدرتمندترین فریمورک فرانت‌اند

آیا می‌دانستید که آموزش ری اکت (React) یکی از پرجستجوترین موضوعات در حوزه برنامه‌نویسی فرانت‌اند است؟ طبق آمار سایت Stack Overflow، ری اکت برای ششمین سال متوالی به عنوان محبوب‌ترین فریمورک و کتابخانه جاوااسکریپت انتخاب شده است. دلیل اصلی، سادگی یادگیری، انعطاف‌پذیری بالا و قدرت در ساخت اپلیکیشن تک صفحه‌ای (SPA) است.

فهرست مطالب پنهان

ری اکت (React.js) کتابخانه‌ای متن‌باز است که توسط فیسبوک توسعه یافته و امروزه شرکت‌های بزرگی مانند نتفلیکس، اینستاگرام، Airbnb و اپل از آن برای توسعه رابط‌های کاربری خود استفاده می‌کنند. در این مقاله از آکادمی فگابین، با آموزش ری اکت از صفر تا صد آشنا می‌شوید. علاوه بر این، مبانی پایه، مفاهیم پیشرفته و نحوه ساخت اپلیکیشن تک صفحه‌ای را گام‌به‌گام یاد خواهید گرفت.

اگر یک برنامه‌نویس جاوااسکریپت هستید و می‌خواهید وارد دنیای حرفه‌ای توسعه فرانت‌اند شوید، این مقاله نقطه شروع عالی برای شما خواهد بود.

ری اکت چیست و چرا باید آن را یاد بگیریم؟

برای شروع آموزش ری اکت، اول از همه باید بدانیم این کتابخانه چیست و چه مزایایی نسبت به سایر فریمورک‌ها دارد.

ری اکت چیست؟

ری اکت (React) یک کتابخانه جاوااسکریپت برای ساخت رابط‌های کاربری تعاملی و پویا است. این کتابخانه توسط مهندس فیسبوک به نام جردن واکه در سال ۲۰۱۳ به صورت متن‌باز منتشر شد. برخلاف فریمورک‌های کامل مانند Angular، ری اکت فقط مسئول لایه View (نمایش) برنامه است و برای ساخت اپلیکیشن‌های کامل به کتابخانه‌های جانبی نیاز دارد.

مهم‌ترین ویژگی‌های ری اکت:

  • مبتنی بر کامپوننت: رابط کاربری به قطعات کوچک و قابل استفاده مجدد تقسیم می‌شود
  • Virtual DOM: به روزرسانی سریع و بهینه صفحه بدون رندر مجدد کل صفحه
  • یکطرفه بودن جریان داده: دیباگ و مدیریت آسان‌تر کد
  • پشتیبانی از هوک‌ها (Hooks): مدیریت state و lifecycle در کامپوننت‌های تابعی
  • جامعه بزرگ و اکوسیستم غنی: هزاران کتابخانه و ابزار کمکی

چرا ری اکت محبوب‌ترین فریمورک فرانت‌اند است؟

طبق نظرسنجی سال ۲۰۲۵ Stack Overflow، ۴۲ درصد از توسعه‌دهندگان حرفه‌ای از ری اکت استفاده می‌کنند. دلایل اصلی این محبوبیت عبارتند از:

۱. یادگیری آسان و منحنی یادگیری ملایم

اگر با جاوااسکریپت آشنایی داشته باشید، می‌توانید ظرف چند هفته با آموزش ری اکت به سطح خوبی برسید. در مقایسه با Angular که مفاهیم پیچیده‌تری مانند TypeScript و RxJS دارد، ری اکت ساده‌تر است.

۲. تقاضای بالای بازار کار

بر اساس داده‌های سایت Indeed، حقوق متوسط توسعه‌دهندگان ری اکت در آمریکا حدود ۱۲۰,۰۰۰ دلار در سال است. همچنین، آگهی‌های شغلی مرتبط با ری اکت نسبت به سایر فریمورک‌ها بیشتر است.

۳. پشتیبانی قوی از سئو و SSR

با استفاده از فریمورک Next.js (که بر پایه ری اکت ساخته شده)، می‌توانید اپلیکیشن‌های سئو دوست و با قابلیت رندر سمت سرور بسازید.

۴. اکوسیستم قدرتمند

ابزارهایی مانند Redux (مدیریت state)، React Router (مدیریت مسیرها)، Next.js (فریمورک کامل) و Vite (ابزار ساخت سریع) اکوسیستم ری اکت را بی‌نظیر کرده‌اند.

مقایسه ری اکت با سایر فریمورک‌ها

ویژگیReactVueAngular
یادگیریآسانآساندشوار
عملکردعالیعالیخوب
محبوبیتبسیار بالابالامتوسط
بازار کارعالیخوبمتوسط
اندازهکوچک (کتابخانه)کوچکبزرگ (فریمورک کامل)
پشتیبانی شرکتیفیسبوکEvan Youگوگل

نکته از آکادمی فگابین: اگر تازه وارد دنیای فریمورک‌های فرانت‌اند شده‌اید، آموزش ری اکت بهترین گزینه است، زیرا هم بازار کار خوبی دارد و هم یادگیری آن نسبتاً آسان است.

پیش‌نیازهای آموزش ری اکت؛ قبل از شروع چه چیزهایی باید بدانید؟

قبل از شروع آموزش ری اکت، باید با مفاهیم پایه جاوااسکریپت آشنا باشید. در این بخش، فهرست کامل پیش‌نیازها را مرور می‌کنیم.

پیش‌نیازهای ضروری جاوااسکریپت

اگر با این مفاهیم آشنا نیستید، ابتدا آنها را یاد بگیرید:

۱. متغیرها و انواع داده (Variables & Data Types)

  • let، const و var
  • تفاوت بین var و let/const
  • انواع داده: string، number، boolean، object، array

۲. توابع (Functions)

  • توابع عادی vs توابع پیکانی (Arrow functions)
  • پارامترها و return
  • توابع درجه اول (First-class functions)

۳. آرایه‌ها و متدهای آن (Arrays & Methods)

  • map()، filter()، reduce() – این سه متد بسیار مهم هستند
  • forEach()، find()، some()، every()

۴. شیءها (Objects)

  • ایجاد و دسترسی به ویژگی‌ها
  • Destructuring (تخریب شیء)
  • Spread operator (...)

۵. متدهای رشته‌ها (String Methods)

  • template literals (استفاده از backticks و ${})

۶. ماژول‌ها (Modules)

  • import و export – برای کار با کامپوننت‌ها ضروری است

۷. Promise و Async/Await

  • درخواست‌های API و کار با داده‌های غیرهمزمان

نصب ابزارهای مورد نیاز

برای شروع آموزش ری اکت، به ابزارهای زیر نیاز دارید:

ابزارتوضیحلینک دانلود
Node.jsمحیط اجرای جاوااسکریپت سمت سرورnodejs.org
npm یا yarnمدیریت پکیج‌ها (به همراه Node.js نصب می‌شود)–
VS Codeبهترین ویرایشگر کد برای ری اکتcode.visualstudio.com
Gitمدیریت نسخه (اختیاری اما توصیه می‌شود)git-scm.com

بررسی نصب صحیح Node.js و npm

برای بررسی نصب صحیح، ترمینال (Command Prompt) را باز کنید و دستورات زیر را وارد کنید:

node --version
npm --version

اگر خروجی مشابه زیر دیدید، نصب شما صحیح است:

v20.10.0
10.2.3

ایجاد اولین پروژه ری اکت با Vite

قدیما برای ایجاد پروژه ری اکت از create-react-app استفاده می‌شد. اما امروزه ابزار Vite بسیار سریع‌تر و سبک‌تر است. برای شروع، دستورات زیر را در ترمینال وارد کنید:

npm create vite@latest my-first-react-app -- --template react
cd my-first-react-app
npm install
npm run dev

پس از اجرا، آدرس http://localhost:5173 را در مرورگر باز کنید. تبریک می‌گویم! اولین پروژه ری اکت شما ساخته شده است.

نکته از آکادمی فگابین: اگر با خطای command not found مواجه شدید، مطمئن شوید Node.js به درستی نصب شده است. همچنین، می‌توانید از نسخه‌های LTS (پشتیبانی طولانی مدت) Node.js استفاده کنید.

مفاهیم پایه در ری اکت؛ JSX و کامپوننت

در این بخش از آموزش ری اکت، با دو مفهوم بنیادین یعنی JSX و کامپوننت آشنا می‌شوید.

JSX چیست؟

JSX مخفف JavaScript XML است و به شما اجازه می‌دهد کد شبیه به HTML را در فایل‌های جاوااسکریپت بنویسید. برخلاف HTML واقعی، JSX در مرورگر اجرا نمی‌شود و باید توسط ابزارهایی مانند Babel به جاوااسکریپت خالص تبدیل گردد.

مثال ساده JSX:

const element = <h1>سلام، دنیای ری اکت!</h1>;

قوانین مهم JSX:

۱. استفاده از className به جای class

در HTML از class استفاده می‌شود، اما در JSX باید از className استفاده کنید.

// درست
<div className="container">محتوا</div>

// غلط
<div class="container">محتوا</div>

۲. استفاده از {} برای جاوااسکریپت

برای نوشتن کد جاوااسکریپت داخل JSX، از {} استفاده کنید:

const name = "علی";
const element = <h1>سلام {name}!</h1>;

۳. بسته شدن تگ‌ها

همه تگ‌ها باید بسته شوند. برای مثال، تگ <br> در JSX به صورت <br /> نوشته می‌شود.

کامپوننت در ری اکت چیست؟

کامپوننت‌ها بلوک‌های سازنده رابط کاربری در ری اکت هستند. هر کامپوننت یک قطعه مستقل و قابل استفاده مجدد است که ظاهر و رفتار خاص خود را دارد.

انواع کامپوننت در ری اکت:

نوعتوضیحمثال
کامپوننت تابعیساده‌تر و مدرن‌تر، مبتنی بر تابعfunction Welcome() { return <h1>Hello</h1>; }
کامپوننت کلاسیقدیمی‌تر، دارای متد lifecycleclass Welcome extends React.Component { ... }

توصیه: در آموزش ری اکت امروزی، از کامپوننت‌های تابعی و هوک‌ها استفاده می‌شود. بنابراین، ما نیز روی همین روش تمرکز می‌کنیم.

 ساخت اولین کامپوننت ری اکت

یک فایل جدید به نام Welcome.jsx در پوشه src بسازید و کد زیر را وارد کنید:

function Welcome() {
  return <h1>به آکادمی فگابین خوش آمدید!</h1>;
}

export default Welcome;

استفاده از کامپوننت در App.jsx

فایل App.jsx را باز کنید و کامپوننت Welcome را فراخوانی کنید:

import Welcome from './Welcome';

function App() {
  return (
    <div>
      <Welcome />
      <Welcome />
      <Welcome />
    </div>
  );
}

export default App;

خروجی: عبارت «به آکادمی فگابین خوش آمدید!» سه بار نمایش داده می‌شود.

ارسال داده به کامپوننت – Props (خصوصیات)

Props به شما امکان می‌دهد داده را از والد به فرزند منتقل کنید. برای مثال:

// کامپوننت Welcome با props
function Welcome(props) {
  return <h1>سلام {props.name}!</h1>;
}

// استفاده در App
function App() {
  return (
    <div>
      <Welcome name="علی" />
      <Welcome name="مریم" />
      <Welcome name="رضا" />
    </div>
  );
}

نکته از آکادمی فگابین: Props فقط خواندنی (Read-only) هستند. به عبارت دیگر، کامپوننت فرزند نمی‌تواند props را تغییر دهد.

و مدیریت داده در ری اکت؛ قلب تپنده اپلیکیشن‌های پویا State

در این بخش از آموزش ری اکت، با مفهوم State (وضعیت) و نحوه مدیریت داده‌های پویا در اپلیکیشن آشنا می‌شوید.

تفاوت State و Props

ویژگیPropsState
قابلیت تغییرفقط خواندنی (Read-only)قابل تغییر (Mutable)
مالکیتکامپوننت والدخود کامپوننت
کاربردارسال داده از والد به فرزندنگهداری داده‌ای که در طول زمان تغییر می‌کند
منبع دادهاز بیرون کامپوننت دریافت می‌شوددرون کامپوننت تعریف می‌شود

هوک useState؛ مدیریت state در کامپوننت‌های تابعی

برای استفاده از state در کامپوننت‌های تابعی، از هوک useState استفاده می‌کنیم. این هوک یک آرایه دو عضوی برمی‌گرداند: مقدار فعلی state و تابع به‌روزرسانی آن.

نحوه استفاده از useState:

import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0); // مقدار اولیه 0

  return (
    <div>
      <p>شمارش: {count}</p>
      <button onClick={() => setCount(count + 1)}>
        افزایش
      </button>
    </div>
  );

نکات مهم درباره useState:

  • اولاً، هوک‌ها فقط در بالای کامپوننت‌های تابعی قابل استفاده هستند (نه داخل حلقه‌ها یا شرط‌ها)
  • ثانیاً، تابع setCount باعث رندر مجدد کامپوننت می‌شود
  • ثالثاً، می‌توانید هر نوع داده‌ای را در state ذخیره کنید (عدد، رشته، آرایه، شیء)

آرایه‌ای state مدیریت

برای کار با آرایه‌ها، باید همیشه یک آرایه جدید ایجاد کنید و مستقیماً state را تغییر ندهید:

function TodoList() {
  const [todos, setTodos] = useState(['یادگیری ری اکت', 'ساخت پروژه']);

  const addTodo = () => {
    setTodos([...todos, 'کار جدید']); // spread operator برای افزودن آیتم جدید
  };

  const removeTodo = (index) => {
    const newTodos = [...todos];
    newTodos.splice(index, 1);
    setTodos(newTodos);
  };

  return (
    <ul>
      {todos.map((todo, index) => (
        <li key={index}>
          {todo}
          <button onClick={() => removeTodo(index)}>حذف</button>
        </li>
      ))}
      <button onClick={addTodo}>افزودن کار</button>
    </ul>
  );
}




مدیریت state شیء

هنگام کار با شیءها، باید از spread operator برای حفظ مقادیر قبلی استفاده کنید:

function UserProfile() {
  const [user, setUser] = useState({ name: '', age: 0, email: '' });

  const updateName = (newName) => {
    setUser({ ...user, name: newName }); // فقط name تغییر می‌کند
  };

  return (
    <div>
      <p>نام: {user.name}</p>
      <p>سن: {user.age}</p>
      <p>ایمیل: {user.email}</p>
      <button onClick={() => updateName('علی')}>تغییر نام</button>
    </div>
  );
}

قانون طلایی در به‌روزرسانیstate

هرگز state را مستقیماً تغییر ندهید:

// ❌ اشتباه – باعث رندر مجدد نمی‌شود
count = count + 1;

// ✅ درست
setCount(count + 1);

برای آرایه‌ها و اشیاء نیز همین قانون صدق می‌کند:

// ❌ اشتباه
todos.push('کار جدید');
setTodos(todos);

// ✅ درست
setTodos([...todos, 'کار جدید']);

نکته از آکادمی فگابین: در آموزش ری اکت، تسلط بر مفاهیم state و props بسیار حیاتی است. تقریباً هر اپلیکیشن ری اکتی نیاز به مدیریت state دارد، بنابراین این مفاهیم را خوب تمرین کنید.

ساخت اپلیکیشن تک صفحه‌ای (SPA) با React Router

یکی از نقاط قوت اصلی آموزش ری اکت، توانایی ساخت اپلیکیشن تک صفحه‌ای (SPA) است. در این بخش، با کتابخانه React Router آشنا می‌شوید که مسیرهای مختلف اپلیکیشن شما را مدیریت می‌کند.

اپلیکیشن تک صفحه‌ای (SPA) چیست؟

در اپلیکیشن تک صفحه‌ای، بارگذاری صفحه فقط یک بار انجام می‌شود. پس از آن، با کلیک روی لینک‌ها، محتوای صفحه بدون رفرش کامل تغییر می‌کند. این روش تجربه کاربری بسیار روان‌تری ایجاد می‌کند.

مزایای SPA:

  • نخست، سرعت بالا (بدون بارگذاری مجدد صفحه)
  • دوم، تجربه کاربری شبیه اپلیکیشن موبایل
  • سوم، کاهش بار سرور
  • چهارم، امکان کار آفلاین (با PWA)

نصب React Router

برای شروع، باید React Router را در پروژه خود نصب کنید:
npm install react-router-dom

ساختار پایه یک اپلیکیشن با React Router

ابتدا، فایل main.jsx را برای استفاده از Router تنظیم کنید:

import React from 'react';
import ReactDOM from 'react-dom/client';
import { BrowserRouter } from 'react-router-dom';
import App from './App';

ReactDOM.createRoot(document.getElementById('root')).render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
);

سپس، در فایل App.jsx مسیرهای خود را تعریف کنید:

import { Routes, Route, Link } from 'react-router-dom';
import Home from './pages/Home';
import About from './pages/About';
import Contact from './pages/Contact';

function App() {
  return (
    <div>
      {/* منوی ناوبری */}
      <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>
    </div>
  );
}

export default App;

ایجاد صفحات (کامپوننت‌های صفحه)

حالا، کامپوننت‌های صفحات را در پوشه pages ایجاد کنید:

src/pages/Home.jsx:

function Home() {
  return <h1>صفحه اصلی</h1>;
}
export default Home;

src/pages/About.jsx:

function About() {
  return <h1>درباره ما</h1>;
}
export default About;

src/pages/Contact.jsx:

function Contact() {
  return <h1>تماس با ما</h1>;
}
export default Contact;

پارامترهای پویا در مسیرها

برای ساخت صفحات پویا (مثل صفحه محصول با ID مختلف)، از پارامترهای مسیر استفاده کنید:

// در App.jsx
<Route path="/product/:id" element={<ProductDetail />} />

// در کامپوننت ProductDetail
import { useParams } from 'react-router-dom';

function ProductDetail() {
  const { id } = useParams(); // دریافت پارامتر از مسیر
  return <h1>جزئیات محصول {id}</h1>;
}

لینک‌های فعال (Active Links)

برای تشخیص لینک فعال، می‌توانید از NavLink به جای Link استفاده کنید:

import { NavLink } from 'react-router-dom';

<NavLink 
  to="/about" 
  className={({ isActive }) => isActive ? 'active-link' : ''}
>
  درباره ما
</NavLink>

هدایت برنامه‌نویسی شده (Programmatic Navigation)

گاهی نیاز است بدون کلیک کاربر، به صفحه دیگری هدایت شوید. برای این کار، از هوک useNavigate استفاده کنید:

import { useNavigate } from 'react-router-dom';

function Login() {
  const navigate = useNavigate();

  const handleLogin = () => {
    // بعد از ورود موفق
    navigate('/dashboard');
  };

  return <button onClick={handleLogin}>ورود</button>;
}

جدول خلاصه کامپوننت‌های React Router

کامپوننت/هوککاربرد
BrowserRouterقراردادن در ریشه اپلیکیشن
Routesمحفظه تعریف مسیرها
Routeتعریف یک مسیر خاص
Linkلینک به مسیر دیگر (بدون رفرش)
NavLinkنسخه پیشرفته Link با تشخیص حالت فعال
useParamsدریافت پارامترهای پویا از مسیر
useNavigateهدایت برنامه‌نویسی شده به مسیر دیگر

نکته از آکادمی فگابین: React Router یکی از مهم‌ترین کتابخانه‌های جانبی در آموزش ری اکت است. اگر قصد ساخت اپلیکیشن‌های چند صفحه‌ای را دارید، تسلط بر این ابزار ضروری است.

هوک‌های مهم ری اکت؛ useEffect، useContext و useRef

در این بخش از آموزش ری اکت، با مهم‌ترین هوک‌های داخلی ری اکت آشنا می‌شوید که زندگی برنامه‌نویسی شما را بسیار ساده‌تر می‌کنند.

هوک useEffect – مدیریت عوارض جانبی

هوک useEffect به شما اجازه می‌دهد کدهایی را اجرا کنید که «عوارض جانبی» (Side Effects) دارند. برای مثال، فراخوانی API، تنظیم تایمر، یا تعامل با DOM.

نحوه استفاده از useEffect:

import { useState, useEffect } from 'react';

function UserList() {
  const [users, setUsers] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    // این کد بعد از رندر اول اجرا می‌شود
    fetch('https://jsonplaceholder.typicode.com/users')
      .then(response => response.json())
      .then(data => {
        setUsers(data);
        setLoading(false);
      });
  }, []); // آرایه خالی = فقط یک بار اجرا شود

  if (loading) return <p>در حال بارگذاری...</p>;

  return (
    <ul>
      {users.map(user => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
}

سه حالت استفاده از useEffect:

حالتکدزمان اجرا
بدون وابستگیuseEffect(() => { ... })بعد از هر رندر
آرایه خالیuseEffect(() => { ... }, [])فقط یک بار (بعد از رندر اول)
با وابستگیuseEffect(() => { ... }, [count])هر بار که count تغییر کند

هوک useContext – اشتراک سراسری داده

برخلاف props که داده را از والد به فرزند منتقل می‌کنند، useContext به شما اجازه می‌دهد داده را در کل اپلیکیشن بدون نیاز به ارسال از طریق props به اشتراک بگذارید.

مراحل استفاده از Context:

گام اول – ایجاد Context:

// src/context/ThemeContext.jsx
import { createContext, useState } from 'react';

export const ThemeContext = createContext();

export function ThemeProvider({ children }) {
  const [theme, setTheme] = useState('light');

  return (
    <ThemeContext.Provider value={{ theme, setTheme }}>
      {children}
    </ThemeContext.Provider>
  );
}

گام دوم – استفاده در کل اپلیکیشن (main.jsx):

import { ThemeProvider } from './context/ThemeContext';

ReactDOM.createRoot(document.getElementById('root')).render(
  <ThemeProvider>
    <App />
  </ThemeProvider>
);

گام سوم – استفاده از Context در کامپوننت:

import { useContext } from 'react';
import { ThemeContext } from './context/ThemeContext';

function ThemedButton() {
  const { theme, setTheme } = useContext(ThemeContext);

  return (
    <button onClick={() => setTheme(theme === 'light' ? 'dark' : 'light')}>
      حالت فعلی: {theme}
    </button>
  );
}

هوک useRef – ارجاع به عناصر DOM

useRef دو کاربرد اصلی دارد:

۱. دسترسی مستقیم به عناصر DOM (بدون استفاده از document.querySelector):

import { useRef } from 'react';

function InputFocus() {
  const inputRef = useRef(null);

  const focusInput = () => {
    inputRef.current.focus(); // فوکوس روی input
  };

  return (
    <div>
      <input ref={inputRef} type="text" placeholder="نام خود را وارد کنید" />
      <button onClick={focusInput}>فوکوس روی ورودی</button>
    </div>
  );
}

۲. ذخیره مقادیری که باعث رندر مجدد نمی‌شوند:

function Timer() {
  const [count, setCount] = useState(0);
  const intervalRef = useRef(null);

  const startTimer = () => {
    intervalRef.current = setInterval(() => {
      setCount(c => c + 1);
    }, 1000);
  };

  const stopTimer = () => {
    clearInterval(intervalRef.current);
  };

  return (
    <div>
      <p>زمان: {count} ثانیه</p>
      <button onClick={startTimer}>شروع</button>
      <button onClick={stopTimer}>توقف</button>
    </div>
  );
}

جدول خلاصه هوک‌های پرکاربرد ری اکت

هوککاربردزمان استفاده
useStateمدیریت state در کامپوننتهمیشه
useEffectمدیریت عوارض جانبی (API، تایمر، DOM)نیاز به اجرای کد بعد از رندر
useContextاشتراک داده سراسریجلوگیری از prop drilling
useRefدسترسی به DOM یا ذخیره مقدار بدون رندرفوکوس، تایمر، ذخیره مقدار موقت
useCallbackذخیره توابع (بهینه‌سازی)جلوگیری از رندرهای اضافی
useMemoذخیره مقادیر محاسباتی سنگینبهینه‌سازی عملکرد

نکته از آکادمی فگابین: تسلط بر هوک‌ها یکی از مهم‌ترین مهارت‌ها در آموزش ری اکت است. پیشنهاد می‌کنم هر هوک را در یک پروژه کوچک جداگانه تمرین کنید.

ساخت اپلیکیشن عملی؛ پروژه Todo List با ری اکت

در این بخش از آموزش ری اکت، تمام مفاهیمی که تاکنون یاد گرفته‌اید را در قالب یک پروژه عملی پیاده‌سازی می‌کنیم. پروژه Todo List یک اپلیکیشن مدیریت وظایف است که شامل افزودن، حذف و ویرایش تسک‌ها می‌شود.

ساختار پروژه

قبل از شروع، ساختار پوشه‌های پروژه را به این شکل ایجاد کنید:

my-todo-app/
├── src/
│ ├── components/
│ │ ├── TodoForm.jsx
│ │ ├── TodoList.jsx
│ │ └── TodoItem.jsx
│ ├── App.jsx
│ └── main.jsx
├── index.html
└── package.json

مرحله ۱: ایجاد state اصلی در App.jsx

// src/App.jsx
import { useState } from 'react';
import TodoForm from './components/TodoForm';
import TodoList from './components/TodoList';
import './App.css';

function App() {
  const [todos, setTodos] = useState([
    { id: 1, text: 'یادگیری ری اکت', completed: false },
    { id: 2, text: 'ساخت پروژه Todo', completed: false },
    { id: 3, text: 'تمرین هوک‌ها', completed: true },
  ]);

  // افزودن تسک جدید
  const addTodo = (text) => {
    const newTodo = {
      id: Date.now(),
      text: text,
      completed: false,
    };
    setTodos([...todos, newTodo]);
  };

  // حذف تسک
  const deleteTodo = (id) => {
    setTodos(todos.filter(todo => todo.id !== id));
  };

  // تغییر وضعیت (انجام شده/انجام نشده)
  const toggleTodo = (id) => {
    setTodos(
      todos.map(todo =>
        todo.id === id ? { ...todo, completed: !todo.completed } : todo
      )
    );
  };

  // ویرایش تسک
  const editTodo = (id, newText) => {
    setTodos(
      todos.map(todo =>
        todo.id === id ? { ...todo, text: newText } : todo
      )
    );
  };

  return (
    <div className="app">
      <h1>مدیریت وظایف</h1>
      <p>تعداد وظایف انجام شده: {todos.filter(t => t.completed).length}</p>
      <TodoForm addTodo={addTodo} />
      <TodoList 
        todos={todos}
        deleteTodo={deleteTodo}
        toggleTodo={toggleTodo}
        editTodo={editTodo}
      />
    </div>
  );
}

export default App;




مرحله ۲: ساخت کامپوننت فرم افزودن تسک (TodoForm.jsx)

// src/components/TodoForm.jsx
import { useState } from 'react';

function TodoForm({ addTodo }) {
  const [inputValue, setInputValue] = useState('');

  const handleSubmit = (e) => {
    e.preventDefault();
    if (inputValue.trim()) {
      addTodo(inputValue);
      setInputValue('');
    }
  };

  return (
    <form onSubmit={handleSubmit} className="todo-form">
      <input
        type="text"
        value={inputValue}
        onChange={(e) => setInputValue(e.target.value)}
        placeholder="یک وظیفه جدید اضافه کنید..."
        className="todo-input"
      />
      <button type="submit" className="todo-button">افزودن</button>
    </form>
  );
}

export default TodoForm;

مرحله ۳: ساخت کامپوننت لیست تسک‌ها (TodoList.jsx)

// src/components/TodoList.jsx
import TodoItem from './TodoItem';

function TodoList({ todos, deleteTodo, toggleTodo, editTodo }) {
  if (todos.length === 0) {
    return <p className="empty-message">هیچ وظیفه‌ای وجود ندارد!</p>;
  }

  return (
    <ul className="todo-list">
      {todos.map(todo => (
        <TodoItem
          key={todo.id}
          todo={todo}
          deleteTodo={deleteTodo}
          toggleTodo={toggleTodo}
          editTodo={editTodo}
        />
      ))}
    </ul>
  );
}

export default TodoList;

مرحله ۴: ساخت کامپوننت آیتم تسک (TodoItem.jsx)

// src/components/TodoItem.jsx
import { useState } from 'react';

function TodoItem({ todo, deleteTodo, toggleTodo, editTodo }) {
  const [isEditing, setIsEditing] = useState(false);
  const [editText, setEditText] = useState(todo.text);

  const handleEdit = () => {
    if (editText.trim()) {
      editTodo(todo.id, editText);
      setIsEditing(false);
    }
  };

  return (
    <li className={`todo-item ${todo.completed ? 'completed' : ''}`}>
      <input
        type="checkbox"
        checked={todo.completed}
        onChange={() => toggleTodo(todo.id)}
        className="todo-checkbox"
      />
      
      {isEditing ? (
        <input
          type="text"
          value={editText}
          onChange={(e) => setEditText(e.target.value)}
          onBlur={handleEdit}
          onKeyPress={(e) => e.key === 'Enter' && handleEdit()}
          className="todo-edit-input"
          autoFocus
        />
      ) : (
        <span className="todo-text" onDoubleClick={() => setIsEditing(true)}>
          {todo.text}
        </span>
      )}
      
      <div className="todo-actions">
        <button onClick={() => setIsEditing(true)} className="edit-btn">
          ✏️
        </button>
        <button onClick={() => deleteTodo(todo.id)} className="delete-btn">
          🗑️
        </button>
      </div>
    </li>
  );
}

export default TodoItem;

مرحله ۵: استایل‌دهی با CSS (App.css)

/* src/App.css */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  font-family: system-ui, -apple-system, sans-serif;
  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  min-height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
}

.app {
  background: white;
  max-width: 600px;
  width: 90%;
  margin: 2rem auto;
  padding: 2rem;
  border-radius: 1rem;
  box-shadow: 0 20px 60px rgba(0,0,0,0.3);
}

h1 {
  text-align: center;
  color: #333;
  margin-bottom: 0.5rem;
}

.todo-form {
  display: flex;
  gap: 0.5rem;
  margin: 1.5rem 0;
}

.todo-input {
  flex: 1;
  padding: 0.75rem;
  border: 2px solid #ddd;
  border-radius: 0.5rem;
  font-size: 1rem;
}

.todo-button {
  padding: 0.75rem 1.5rem;
  background: #667eea;
  color: white;
  border: none;
  border-radius: 0.5rem;
  cursor: pointer;
  font-size: 1rem;
}

.todo-list {
  list-style: none;
  margin-top: 1rem;
}

.todo-item {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.75rem;
  background: #f8f9fa;
  border-radius: 0.5rem;
  margin-bottom: 0.5rem;
}

.todo-item.completed .todo-text {
  text-decoration: line-through;
  color: #888;
}

.todo-text {
  flex: 1;
  cursor: pointer;
}

.todo-actions {
  display: flex;
  gap: 0.5rem;
}

.edit-btn, .delete-btn {
  background: none;
  border: none;
  cursor: pointer;
  font-size: 1.2rem;
  padding: 0.25rem;
}

.empty-message {
  text-align: center;
  color: #888;
  padding: 2rem;
}

اجرای پروژه

برای اجرای پروژه، دستورات زیر را در ترمینال وارد کنید:

npm run dev

سپس آدرس http://localhost:5173 را در مرورگر باز کنید.

قابلیت‌های این پروژه:

  • افزودن وظیفه جدید
  • حذف وظیفه
  • علامت زدن وظیفه به عنوان انجام شده
  • ویرایش وظیفه با دوبار کلیک
  • نمایش تعداد وظایف انجام شده
  • ذخیره وضعیت در state (با رفرش صفحه از بین می‌رود)

نکته از آکادمی فگابین: برای ذخیره‌سازی دائمی تسک‌ها، می‌توانید از localStorage یا یک backend واقعی استفاده کنید. این تمرین را به عنوان پروژه نهایی آموزش ری اکت خود کامل کنید.

بهترین منابع برای ادامه یادگیری ری اکت

آموزش ری اکت فقط با خواندن یک مقاله تمام نمی‌شود. در این بخش، بهترین منابع رایگان و پولی را برای ادامه مسیر یادگیری معرفی می‌کنیم.

منابع رایگان

۱. مستندات رسمی ری اکت (React.dev)

آدرس: react.dev

مستندات رسمی ری اکت به تازگی بازنویسی شده و به عنوان یکی از بهترین منابع آموزشی برای مبتدیان شناخته می‌شود. این مستندات شامل مثال‌های تعاملی و تمرین‌های عملی است.

۲. دوره رایگان ری اکت در YouTube

کانال‌های زیر دوره‌های رایگان و باکیفیتی دارند:

  • freeCodeCamp – دوره ۱۰ ساعته ری اکت
  • Traversy Media – پروژه‌های عملی
  • Codevolution – آموزش قدم‌به‌قدم

۳. Frontend Mentor

آدرس: frontendmentor.io

این وب‌سایت پروژه‌های آماده با طراحی حرفه‌ای ارائه می‌دهد که می‌توانید با ری اکت پیاده‌سازی کنید.

منابع پولی (توصیه شده)

منبعتوضیحهزینه تقریبی
React – The Complete Guide (Udemy)دوره جامع توسط Maximilian Schwarzmüller۱۰ تا ۲۰ دلار
Epic React (Kent C. Dodds)دوره پیشرفته برای حرفه‌ای‌ها۴۰۰ دلار (ارزشش را دارد)
Frontend Mastersدوره‌های تخصصی با بهترین مدرسان۳۹ دلار ماهانه

کتاب‌های پیشنهادی

۱. راهنمای عملی ری اکت (The Road to React)
نویسنده: Robin Wieruch – نسخه رایگان آنلاین موجود است

۲. ری اکت جامع (Fullstack React)
ناشر: Fullstack.io – مناسب برای سطوح متوسط تا پیشرفته

تمرین‌های پیشنهادی

پس از پایان آموزش ری اکت، این پروژه‌ها را برای تقویت مهارت خود پیاده‌سازی کنید:

سطح مبتدی:

  • ماشین حساب ساده
  • نمایش آب و هوا با API
  • گالری تصاویر

سطح متوسط:

  • فروشگاه آنلاین ساده (با سبد خرید)
  • بلاگ با قابلیت جستجو و فیلتر
  • داشبورد مدیریت با نمودارها

سطح پیشرفته:

  • کلون یوتیوب (با قابلیت پخش ویدیو)
  • اپلیکیشن چت زنده (با Socket.io)
  • سیستم مدیریت محتوای کامل

نقشه راه یادگیری ری اکت

مرحله ۱ (هفته ۱-۲): مبانی جاوااسکریپت (ES6) و مفاهیم پایه ری اکت (JSX، کامپوننت، props)

مرحله ۲ (هفته ۳-۴): هوک‌های useState، useEffect و پروژه‌های کوچک

مرحله ۳ (هفته ۵-۶): React Router و ساخت اپلیکیشن‌های چند صفحه‌ای

مرحله ۴ (هفته ۷-۸): مدیریت state پیشرفته (Context API یا Redux)

مرحله ۵ (هفته ۹-۱۰): کار با API و فرم‌ها

مرحله ۶ (هفته ۱۱-۱۲): Next.js و SSR (رندر سمت سرور)

نکته از آکادمی فگابین: مهم‌ترین چیز در آموزش ری اکت، تمرین مداوم است. توصیه می‌کنم هر روز حداقل ۳۰ دقیقه کد بزنید و پروژه‌های مختلف بسازید. به یاد داشته باشید، دیدن ویدیوهای آموزشی بدون تمرین عملی نتیجه مطلوبی نخواهد داشت.

نتیجه‌گیری؛ ری اکت دروازه ورود به دنیای حرفه‌ای توسعه فرانت‌اند

در این مقاله از آکادمی فگابین، با آموزش ری اکت از صفر تا صد آشنا شدید. از مفاهیم پایه مانند JSX و کامپوننت گرفته تا هوک‌های پیشرفته و ساخت اپلیکیشن کامل Todo List.

خلاصه نکات کلیدی

مرحلهعنوانمفاهیم کلیدی
۱مبانیJSX، کامپوننت، Props
۲مدیریت دادهState، useState
۳مسیرهاReact Router، SPA
۴هوک‌هاuseEffect، useContext، useRef
۵پروژه عملیTodo List (CRUD)
۶ادامه مسیرمنابع رایگان و پولی

جمع‌بندی

آموزش ری اکت یک سرمایه‌گذاری هوشمندانه برای آینده شغلی شماست. طبق آمار سایت Indeed، تقاضا برای توسعه‌دهندگان ری اکت در سال ۲۰۲۶ نسبت به سال قبل ۳۵ درصد افزایش یافته است. دلیل اصلی، محبوبیت روزافزون اپلیکیشن‌های تک صفحه‌ای (SPA) و نیاز شرکت‌ها به رابط‌های کاربری سریع و روان است.

اگر تا اینجا همراه ما بوده‌اید، پایه‌های اصلی ری اکت را یاد گرفته‌اید. اما یادگیری واقعی زمانی شروع می‌شود که خودتان دست به کد بزنید و پروژه‌های شخصی بسازید.

حرف آخر

توصیه می‌کنم همین امروز اولین پروژه خود را شروع کنید. اگر به هر مشکلی برخوردید، نترسید – گوگل و مستندات رسمی ری اکت بهترین دوستان شما هستند. و اگر به کمک حرفه‌ای نیاز داشتید، تیم ما در آکادمی فگابین آماده پاسخگویی به سوالات شماست.

دعوت به اقدام نهایی (CTA)

اگر به دنبال پیاده‌سازی آنچه در این مقاله گفتیم – از آموزش ری اکت تا ساخت اپلیکیشن تک صفحه‌ای حرفه‌ای – به بهترین شکل برای کسب‌وکارتان هستید، تیم متخصص فگابین با ارائه مجموعه کاملی از خدمات طراحی و توسعه وب‌سایت، خدمات طراحی و توسعه اپلیکیشن و خدمات سئو در کنار شماست. ما راه‌حل را از مشاوره تا اجرا و پشتیبانی، ساده و شفاف می‌کنیم. آکادمی فگابین نیز با ارائه دوره‌های تخصصی ری اکت و جاوااسکریپت، شما را در مسیر یادگیری همراهی می‌کند. دعوتتان می‌کنیم:

کار ما را در شبکه‌های اجتماعی دنبال کنید تا از آخرین روندهای فناوری باخبر بمانید:

همچنین برای مطالعه مقالات آموزشی بیشتر، از وبلاگ فگابین دیدن فرمایید.

مقالات مرتبط
پاسخ دهید

آدرس ایمیل شما منتشر نخواهد شد.قسمتهای مورد نیاز علامت گذاری شده اند *