React: مقدمة إلى React
React هي مكتبة JavaScript مخصصة لإنشاء واجهات المستخدم. إذا قارنا صفحة الويب بمنزل، فإن HTML تمثل الجدران المبنية من الطوب، وCSS تمثل التصميم الداخلي، وJavaScript تمثل أنظمة الكهرباء والسباكة؛ فإن React هي نظام تجميع جاهز — فهي تتيح لك تصميم كل غرفة (مكون) على حدة ثم تجميعها معًا لتشكيل مبنى كامل.
1. ما ستتعلمه
- ما هو React، ولماذا نحتاج إليه؟
- البرمجة التصريحية مقابل البرمجة الأمرية
- كيف يعمل DOM الافتراضي
- React مقابل Vue مقابل Angular
- نظرة عامة على منظومة React
2. قصة حقيقية لمطور واجهة المستخدم
(1) المشكلة: صفحة واحدة، 30,000 سطر من jQuery
تعمل أليس كمطورة واجهة مستخدم في شركة متوسطة الحجم متخصصة في التجارة الإلكترونية. وتمتلك الشركة لوحة تحكم إدارية تم تطويرها باستخدام jQuery على مدار ثلاث سنوات، وتضم أكثر من 30,000 سطر من التعليمات البرمجية.
▶ مثال: مقدمة إلى React
// A typical product list page — jQuery code
function updateProductList(category) {
// Manual DOM operation
$('#product-list').empty()
$('#loading-spinner').show()
$.get('/api/products?category=' + category, function(data) {
$('#loading-spinner').hide()
data.forEach(function(product) {
// Concatenate HTML strings line by line
var html = '<div class="product-card">' +
'<h3>' + product.name + '</h3>' +
'<p>' + product.price + '</p>' +
'<button onclick="addToCart(' + product.id + ')">Add to Cart</button>' +
'</div>'
$('#product-list').append(html)
})
})
}
المشكلة في هذه الصفحة هي:
- عدم التزامن بين الحالة وDOM: عندما يتغير إجمالي قيمة سلة التسوق، يجب تحديث الأرقام الموجودة في الأماكن الثلاثة الأخرى على الصفحة يدويًّا.
- صعوبة الصيانة: قد يتطلب تعديل ميزة واحدة إجراء تغييرات على خمسة ملفات
- مشكلات الأداء: كل تحديث يتعامل مباشرةً مع نموذج DOM الفعلي، مما يتسبب في حدوث عمليات إعادة ترتيب وإعادة رسم متكررة على الصفحة
(2) نهج React: نهج إعلاني + قائم على المكونات
إعادة كتابة نفس المنطق باستخدام React:
function ProductList({ category }) {
const [products, setProducts] = React.useState([])
const [loading, setLoading] = React.useState(true)
React.useEffect(() => {
fetch('/api/products?category=' + category)
.then(res => res.json())
.then(data => {
setProducts(data)
setLoading(false)
})
}, [category])
if (loading) return <Spinner />
return (
<div className="product-grid">
{products.map(product => (
<ProductCard key={product.id} product={product} />
))}
</div>
)
}
المزايا: تخفيض حجم الكود بنسبة 70%، ومزامنة الحالة تلقائيًّا، وعدم تأثير التغييرات التي تطرأ على أحد المكونات على المكونات الأخرى، وزيادة في الأداء بمقدار 5 أضعاف (التحديثات الدفعية لـ DOM الافتراضي).
3. المفاهيم الأساسية في React
(1) البرمجة التصريحية مقابل البرمجة الأمرية
| البعد | الأسلوب الإمبراطوري (jQuery) | الأسلوب التصريحي (React) |
|---|---|---|
| التركيز | كيفية التنفيذ (عمليات DOM خطوة بخطوة) | ما يجب فعله (وصف الحالة النهائية) |
| أسلوب الكتابة البرمجية | خطوة بخطوة | الإعلان الوصفي |
| إدارة الحالة | الحالة اليدوية + التحديث اليدوي لـ DOM | الحالة المُربوطة تلقائيًا بواجهة المستخدم |
| صعوبة تصحيح الأخطاء | يتطلب تتبع كل عملية في DOM | يتطلب فقط مراقبة تغييرات الحالة |
// Imperative: tell the browser what to do at each step
const div = document.createElement('div')
div.className = 'alert'
div.textContent = 'Hello'
document.body.appendChild(div)
// Declarative: tell React what result you want
function Alert({ message }) {
return <div className="alert">{message}</div>
}
// React automatically creates and updates the DOM
(2) DOM الافتراضي
يُعد DOM الافتراضي تقنية أساسية لتحسين أداء React. فهو ليس شجرة DOM حقيقية، بل شجرة كائنات JavaScript خفيفة الوزن.
graph TB
A[State changes] --> B[Create a new virtual DOM tree]
B --> C[Diff A Comparison of Old and New Virtual Environments DOM]
C --> D[Compute minimum update operations]
D --> E[Batch update real DOM]
E --> F[Page update complete]
style A fill:#ff6b6b,color:#fff
style C fill:#4ecdc4,color:#fff
style E fill:#45b7d1,color:#fff
| المفهوم | DOM الحقيقي | DOM الافتراضي |
|---|---|---|
| الجوهر | كائنات المتصفح الأصلية | كائنات جافا سكريبت العادية |
| تكلفة الإنشاء | عالية (تتطلب تخطيط المتصفح) | منخفضة جدًّا (عمليات جافا سكريبت بحتة) |
| طريقة التحديث | التشغيل المباشر، يؤدي إلى إعادة التدفق/إعادة الرسم | التحديث الدفعي بعد المقارنة |
| دقة التحديث | عملية فردية | الحد الأدنى للتحديث الدفعي |
(3) التطوير القائم على المكونات
تتمثل الفكرة الأساسية وراء React في تقسيم الصفحة إلى مكونات مستقلة وقابلة لإعادة الاستخدام، بحيث يكون كل مكون مسؤولاً فقط عن المنطقة المحددة الخاصة به.
| المفهوم | القياس | الشرح |
|---|---|---|
| المكون | مكعب ليغو | كل مكون هو وحدة وظيفية مستقلة |
| الخصائص | لون/حجم الكتلة | المعلمات التي يتم تمريرها من المكون الأصلي إلى المكون الفرعي |
| الحالة | حالة الكتلة (جديدة/قديمة) | البيانات التي يديرها المكون داخليًّا |
| شجرة المكونات | نموذج ليغو مُجمَّع | مكونات متداخلة لتشكيل صفحة |
// Component-based: page broken into independent components
function Page() {
return (
<div>
<Header /> {/* Header navigation */}
<Sidebar /> {/* Sidebar */}
<MainContent /> {/* Main content area */}
<Footer /> {/* Footer copyright */}
</div>
)
}
4. React مقارنةً بالأطر الشائعة الأخرى
| البعد | React | Vue | Angular |
|---|---|---|---|
| المطور | Meta (Facebook) | يو يوشي (فرد) | |
| تاريخ الإصدار الأول | 2013 | 2014 | 2010 |
| النوع | مكتبة واجهة المستخدم | إطار عمل تدريجي | إطار عمل متكامل الميزات |
| بناء جملة القوالب | JSX (HTML مدمج في JavaScript) | قوالب HTML + التوجيهات | TypeScript + الزخارف |
| تدفق البيانات | أحادي الاتجاه (من أعلى إلى أسفل) | ربط ثنائي الاتجاه (نموذج V) | ربط ثنائي الاتجاه |
| إدارة الحالة | حلول المجتمع (Redux/Zustand) | Pinia/Vuex الرسمي | RxJS + Services الرسمي |
| منحنى التعلم | متوسط (يتطلب فهم JSX + Hooks) | منخفض (سهل الاستخدام مع القوالب) | مرتفع (TypeScript + حقن التبعيات) |
| حل SSR | Next.js | Nuxt | Angular Universal |
| حالات الاستخدام | تطبيقات SPAs واسعة النطاق، وتطبيقات الهواتف المحمولة (React Native) | المشاريع الصغيرة والمتوسطة الحجم، والنماذج الأولية السريعة | تطبيقات المؤسسات واسعة النطاق |
| GitHub ⭐ | 230 ألف+ | 220 ألف+ | 100 ألف+ |
| سوق العمل (الصين) | مرتفع (بشكل أساسي في المدن من الدرجة الأولى) | مرتفع (بشكل أساسي في الشركات الصغيرة والمتوسطة) | معتدل (الشركات الأجنبية/شركات التكنولوجيا الكبرى) |
ملخص: يُعد React مناسبًا للمشاريع التي تتطلب تحكمًا عاليًا، وإمكانية إعادة استخدام عالية للمكونات، ودعمًا عبر الأنظمة الأساسية (الويب + الأجهزة المحمولة). أما Vue فهو أسهل في البدء به ومناسب للتكرار السريع. ويُعد Angular مناسبًا للفرق الكبيرة على مستوى المؤسسات.
5. نظرة عامة على منظومة React
React ليس إطار عمل «شاملًا»، بل هو مكتبة واجهة مستخدم مرنة. وهو يعتمد على النظام البيئي للمجتمع لتوفير ميزات مثل التوجيه وإدارة الحالة وأدوات البناء.
| الحقل | الأدوات الأساسية | الوصف |
|---|---|---|
| أدوات البناء | Vite (موصى به) / Create React App | هيكل المشروع وخادم التطوير |
| التوجيه | React Router v6 / TanStack Router | التنقل بين الصفحات وإدارة عناوين URL |
| إدارة الحالات | الحالات / Redux Toolkit / واجهة برمجة تطبيقات السياق | إدارة البيانات العامة |
| استرجاع البيانات | TanStack Query (React Query) / SWR | التخزين المؤقت للبيانات والمزامنة من جانب الخادم |
| تصميم | Tailwind CSS / CSS Modules / styled-components | تصميم المكونات |
| الاختبار | Vitest + React Testing Library / Playwright | اختبار الوحدات واختبار E2E |
| SSR/SSG | Next.js | العرض من جانب الخادم والتوليد الثابت |
| الأجهزة المحمولة | React Native | تطوير تطبيقات الأجهزة المحمولة الأصلية باستخدام React |
| الرسوم المتحركة | Framer Motion / React Spring | الرسوم المتحركة والانتقالات في واجهة المستخدم |
| مكتبات المكونات | Ant Design / MUI / Shadcn/ui | مكونات واجهة المستخدم الجاهزة للاستخدام |
graph LR
A[React] --> B[Build: Vite]
A --> C[Routing: React Router]
A --> D[Status: Zustand/Redux]
A --> E[Data: TanStack Query]
A --> F[Style: Tailwind/CSS Modules]
A --> G[Test: Vitest + RTL]
A --> H[SSR: Next.js]
A --> I[Mobile: React Native]
style A fill:#61dafb,color:#000
style H fill:#000,color:#fff
style I fill:#61dafb,color:#000
6. مثال كامل: إنشاء زر «إعجاب» بسيط باستخدام React
// ============================================
// Example:use React Build a "Like" Button
// Features:Demonstrating Declarative Programming + Component-based + Core Concepts of State Management
// ============================================
import React from 'react'
import { createRoot } from 'react-dom/client'
// 1. Define a "Like" button component
function LikeButton() {
// Usage useState Manage Like Status
const [liked, setLiked] = React.useState(false)
const [count, setCount] = React.useState(0)
// Handling Click Events
function handleClick() {
if (liked) {
setLiked(false)
setCount(count - 1)
} else {
setLiked(true)
setCount(count + 1)
}
}
// Declarative UI:Render different appearances based on state
return (
<button
onClick={handleClick}
style={{
padding: '10px 20px',
fontSize: '16px',
backgroundColor: liked ? '#ff4757' : '#f1f2f6',
color: liked ? '#fff' : '#333',
border: 'none',
borderRadius: '5px',
cursor: 'pointer'
}}
>
{liked ? '❤️ Liked' : '🤍 Like'} ({count})
</button>
)
}
// 2. Add components to the page
function App() {
return (
<div style={{ textAlign: 'center', padding: '50px' }}>
<h1>React Examples of Likes</h1>
<p>Click the button to experience declarative programming UI:Just keep an eye on the status,No action required DOM</p>
<LikeButton />
<LikeButton /> {/* Component Reusability!*/}
</div>
)
}
// 3. Render to page
const root = createRoot(document.getElementById('root'))
root.render(<App />)
ما الذي يوضحه هذا المثال؟
- التعريفي: نكتفي بوصف «الشكل الذي يجب أن يبدو عليه الزر عند تغير حالة الإعجاب»، ويقوم React تلقائيًا بتحديث DOM
- قائم على المكونات:
LikeButtonهو مكون مستقل يمكن إعادة استخدامه عدة مرات- إدارة الحالة: يتم تتبع
likedوcountتلقائيًا بواسطة React؛ ولا يلزم إجراء أي تعديل يدوي على DOM
▶ المثال 2: تصور شجرة مكونات React
// ============================================
// Example:use React The component tree displays the page structure
// Features:Simulate the component tree of a blog homepage,Demonstrating a Component-Based Approach
// ============================================
// Leaf Component:Article Card
function ArticleCard({ title, excerpt }) {
return (
<div style={{ border: '1px solid #eee', borderRadius: '8px', padding: '12px', marginBottom: '12px' }}>
<h3 style={{ margin: '0 0 8px 0' }}>{title}</h3>
<p style={{ color: '#666', margin: 0, fontSize: '14px' }}>{excerpt}</p>
</div>
)
}
// Composite Components:List of Articles
function ArticleList({ articles }) {
return (
<div>
<h2>Latest Articles</h2>
{articles.map(article => (
<ArticleCard key={article.id} title={article.title} excerpt={article.excerpt} />
))}
</div>
)
}
// Composite Components:Sidebar
function Sidebar() {
return (
<div style={{ backgroundColor: '#fafafa', padding: '16px', borderRadius: '8px' }}>
<h3>Categories</h3>
<ul style={{ listStyle: 'none', padding: 0 }}>
<li>React Tutorial (12)</li>
<li>TypeScript (8)</li>
<li>Node.js (5)</li>
</ul>
</div>
)
}
// Root Component:Blog Home
function BlogHome() {
const articles = [
{ id: 1, title: 'React Getting Started Guide', excerpt: 'Study React Core Concepts and Best Practices...' },
{ id: 2, title: 'Understanding the Virtual DOM', excerpt: 'Virtual DOM How to Improve React Application Performance...' },
{ id: 3, title: 'Component Design Patterns', excerpt: 'Master React Techniques for Combining and Reusing Components...' }
]
return (
<div style={{ maxWidth: '960px', margin: '0 auto', padding: '20px' }}>
<header style={{ textAlign: 'center', marginBottom: '24px' }}>
<h1>📝 My Tech Blog</h1>
<nav>
<a href="#" style={{ margin: '0 12px' }}>Home</a>
<a href="#" style={{ margin: '0 12px' }}>About</a>
<a href="#" style={{ margin: '0 12px' }}>Contact</a>
</nav>
</header>
<div style={{ display: 'grid', gridTemplateColumns: '2fr 1fr', gap: '24px' }}>
<ArticleList articles={articles} />
<Sidebar />
</div>
<footer style={{ textAlign: 'center', marginTop: '24px', color: '#999', fontSize: '13px' }}>
<p>© 2026 web-tutorial.com</p>
</footer>
</div>
)
}
// Component tree Structure:
// BlogHome
// ├── header (Navigation Bar)
// └── div.grid
// ├── ArticleList
// │ ├── ArticleCard × 3
// └── Sidebar
// └── Category List
❓ أسئلة شائعة
use() ومكونات الخادم والإجراءات). بالنسبة لبيئات الإنتاج، نوصي بالبدء باستخدام React 18 والترقية بمجرد نضوج منظومة React 19.📖 ملخص
- React هي مكتبة واجهة مستخدم تعتمد على البرمجة التصريحية — حيث تصف النتيجة التي تريدها، وتقوم React بتحديث DOM
- DOM الافتراضي هو جوهر أداء React: فهو يقارن شجرة من كائنات JavaScript لتحديث DOM الفعلي على دفعات.
- البنية القائمة على المكونات هي المبدأ التصميمي الأساسي لـ React — فكل مكون مستقل وقابل لإعادة الاستخدام، ولا يتحمل المسؤولية إلا عن منطقه الخاص.
- يُعد React مناسبًا لتطبيقات الويب أحادية الصفحة (SPAs) واسعة النطاق والتطوير عبر الأنظمة الأساسية المختلفة؛ ويتميز بمنحنى تعلم معتدل (يتطلب فهمًا أساسيًا للغة JavaScript).
- نظام React غني بالميزات ولكنه لا يفرض قيودًا؛ فأنت حر في اختيار أدوات التوجيه وإدارة الحالة وأدوات البناء التي تناسبك.
📝 تمارين
- سؤال أساسي (مستوى الصعوبة: ⭐): انتقل إلى موقع react.dev، وابحث عن قسم «Learn React» في الصفحة الرئيسية، وتصفح الصفحات الثلاث الأولى من الدروس التعليمية، واكتب المفاهيم الثلاثة التي ترى أنها الأكثر أهمية.
- سؤال للتفكير (مستوى الصعوبة: ⭐): اشرح بعباراتك الخاصة الفرق بين «البرمجة التصريحية» و«البرمجة الأمرية»، وقدم مثالاً من الحياة اليومية (لا يقتصر على البرمجة).
- سؤال المقارنة (مستوى الصعوبة: ⭐⭐): إذا أردت إنشاء موقع مدونة، فأيهما تعتقد أنه الأنسب: React أم Vue؟ اذكر سببين على الأقل لدعم اختيارك.