لماذا يُفضَّل استخدام مكوّنات React بدلاً من HTML فقط؟
مقدمة: لماذا لم يعد HTML وحده كافياً في المشاريع الحديثة؟
تُعد HTML اللغة الأساسية لبناء صفحات الويب، ولا يمكن الاستغناء عنها عند إنشاء أي واجهة رقمية. لكن عند الانتقال من صفحة بسيطة إلى تطبيق تفاعلي يضم عشرات أو مئات العناصر المتشابهة، يصبح الاعتماد على HTML الثابت وحده أمراً مرهقاً من حيث التنظيم، والصيانة، وإعادة الاستخدام.
هنا يظهر دور React بوصفه مكتبة JavaScript متخصصة في بناء واجهات الاستخدام بطريقة أكثر مرونة. الفكرة الجوهرية ليست استبدال HTML، بل الاستفادة منه داخل بنية أكثر ذكاءً تسمح بإنشاء مكوّنات قابلة لإعادة الاستخدام، وتمرير البيانات إليها بشكل ديناميكي، ما يسرّع التطوير ويحسن جودة الكود.

ما الذي يجعل React خياراً أفضل من HTML التقليدي؟
ظهرت React عام 2013 كطريقة أكثر كفاءة لبناء تطبيقات الويب باستخدام JavaScript. وغالباً ما تُوصَف بأنها مكتبة لبناء واجهات المستخدم، أو ما يُعرف اختصاراً بـ UI.
تميّز React لا يأتي من إلغاء دور HTML، بل من توظيفه داخل نظام يسهّل بناء الواجهة وتطويرها. فأنت تكتب صياغة قريبة جداً من HTML، لكنك تضيف إليها قدرات JavaScript مثل التكرار، وتمرير البيانات، وتحديث العرض تلقائياً.
- تقليل التكرار في الواجهة.
- إعادة استخدام العناصر المشتركة.
- فصل البيانات عن العرض.
- تسهيل صيانة المشروع مع نموه.
- بناء واجهات ديناميكية بسرعة أكبر.
كيف نبني واجهة باستخدام HTML فقط؟
لفهم قيمة React بشكل عملي، يمكن تخيّل واجهة شبيهة بنتائج بحث Google. إذا أردنا عرض أول ثلاث نتائج لكلمة reactjs باستخدام HTML فقط، فسنكتب العناصر يدوياً نتيجةً بعد أخرى.

<!DOCTYPE html>
<html>
<head>
<title>reactjs Search Results</title>
</head>
<body>
<section>
<div>
<a href="https://reactjs.org">React - A JavaScript Library for Building User Interfaces</a>
<div><h3>reactjs.org</h3></div>
<div>React makes it painless to create interactive UIs.</div>
</div>
<div>
<a href="https://en.wikipedia.org/wiki/React_(web_framework)">React (web framework) - Wikipedia</a>
<div><h3>https://en.wikipedia.org › wiki › React_(web_framework)</h3></div>
<div>React is a JavaScript library for building user interfaces.</div>
</div>
<div>
<a href="https://twitter.com/reactjs?lang=en">React (@reactjs) | Twitter</a>
<div><h3>https://twitter.com › reactjs</h3></div>
<div>The latest Tweets from React (@reactjs).</div>
</div>
</section>
</body>
</html>
هذا الأسلوب قد يكون مناسباً عندما يكون عدد العناصر قليلاً. لكن ماذا لو احتجنا إلى عرض 100 أو 1000 نتيجة مختلفة؟ هنا تبدأ مشاكل التكرار، ويصبح تحديث الواجهة أو توسيعها أكثر صعوبة.
لماذا لا يكفي HTML الثابت عند عرض بيانات كثيرة؟
عندما تتعامل مع بيانات متغيرة مثل نتائج البحث أو المنتجات أو التعليقات، فإن كتابة كل عنصر يدوياً لم تعد عملية. تحتاج إلى طريقة تجعل الواجهة تُنشأ بناءً على البيانات، لا أن تُكتب بالكامل سطراً بسطر.
في هذه المرحلة تصبح JavaScript ضرورة، لأنها تضيف السلوك والديناميكية. وعند الرغبة في تنظيم هذا السلوك داخل واجهة قابلة للتوسع، فإن React يقدم نموذجاً أنظف وأكثر احترافية.
كيفية تحويل صفحة HTML عادية إلى تطبيق React
يمكنك البدء بتضمين React داخل ملف HTML واحد من خلال بعض الملفات الخارجية. هذه الخطوة توضح أن الانتقال إلى React ليس معقداً كما يظن البعض.
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script>
الملف الأول يوفّر مكتبة React نفسها، والثاني ReactDOM المسؤول عن عرض التطبيق داخل المتصفح، أما الثالث فهو Babel الذي يحوّل الصياغة الخاصة بـ React إلى JavaScript صالح للتنفيذ.
<!DOCTYPE html>
<html>
<head>
<title>reactjs Search Results</title>
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script>
</head>
<body>
<script type="text/babel">
// React code will go here
</script>
</body>
</html>
نقطة الدخول في React: كيف يتم عرض التطبيق؟
كل تطبيق React يحتاج إلى نقطة دخول داخل الصفحة، وغالباً تكون عنصراً مثل <div id="root"></div>. بعد ذلك نستخدم الدالة render() من ReactDOM لعرض التطبيق داخل هذا العنصر.
<!DOCTYPE html>
<html>
<head>
<title>reactjs Search Results</title>
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
ReactDOM.render(
<section>
<div>
<a href="https://reactjs.org">React - A JavaScript Library for Building User Interfaces</a>
<div><h3>reactjs.org</h3></div>
<div>React makes it painless to create interactive UIs.</div>
</div>
<div>
<a href="https://en.wikipedia.org/wiki/React_(web_framework)">React (web framework) - Wikipedia</a>
<div><h3>https://en.wikipedia.org › wiki › React_(web_framework)</h3></div>
<div>React is a JavaScript library for building user interfaces.</div>
</div>
<div>
<a href="https://twitter.com/reactjs?lang=en">React (@reactjs) | Twitter</a>
<div><h3>https://twitter.com › reactjs</h3></div>
<div>The latest Tweets from React (@reactjs).</div>
</div>
</section>,
document.getElementById('root')
)
</script>
</body>
</html>
النتيجة هنا لا تختلف بصرياً عن HTML التقليدي، لكنها تمثل بداية الانتقال إلى نمط أكثر مرونة.

قوة React الحقيقية: المكوّنات القابلة لإعادة الاستخدام
إذا تأملت بنية نتائج البحث السابقة، ستلاحظ أن كل نتيجة تتكون من العناصر نفسها تقريباً:
- رابط رئيسي.
- عنوان.
- رابط مختصر أو مسار.
- وصف قصير.
هذا يعني أننا نكرر البنية ذاتها عدة مرات مع اختلاف البيانات فقط. وهنا يأتي مبدأ DRY أو Don't Repeat Yourself، أي تجنب تكرار الكود كلما أمكن.
في React يمكن تحويل هذه البنية المتكررة إلى مكوّن مستقل، وليكن اسمه Link.
function Link() {
// create link HTML output
}
ثم نجعل هذا المكوّن يعيد واجهة نتيجة واحدة:
function Link() {
return (
<div>
<a href="https://reactjs.org">React - A JavaScript Library for Building User Interfaces</a>
<div><h3>reactjs.org</h3></div>
<div>React makes it painless to create interactive UIs.</div>
</div>
);
}
كيف نستخدم المكوّن داخل الواجهة؟
بدلاً من استدعاء الدالة بالشكل التقليدي Link()، يمكن استخدام المكوّن في React كأنه عنصر HTML جديد بالشكل <Link />. هذه من أهم أفكار React: استخدام دوال JavaScript داخل صياغة مشابهة جداً لـ HTML.
ما هو JSX ولماذا نحتاج إلى Babel؟
الصياغة التي تبدو كأنها HTML داخل كود React تُسمى JSX، وهي اختصار لـ JavaScript XML. هذه الصياغة ليست JavaScript خاماً، لذلك نحتاج إلى أداة مثل Babel لتحويلها إلى كود مفهوم للمتصفح.
كما أن JSX أكثر صرامة من HTML في بعض التفاصيل. على سبيل المثال، العنصر <input> يجب أن يُكتب في JSX بهذه الصورة: <input />.

<!DOCTYPE html>
<html>
<head>
<title>reactjs Search Results</title>
<script src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script>
</head>
<body>
<div id="root"></div>
<script type="text/babel">
ReactDOM.render(
<section>
<Link />
<Link />
<Link />
</section>,
document.getElementById("root")
);
</script>
</body>
</html>
بهذا الشكل أصبح لدينا كود أوضح وأسهل قراءة، لأننا لم نعد نغرق في تفاصيل البنية المتكررة.
تشريح المكوّن الدالي Function Component
function Link() {
return (
<div>
<a href="https://reactjs.org">React - A JavaScript Library for Building User Interfaces</a>
<div><h3>reactjs.org</h3></div>
<div>React makes it painless to create interactive UIs.</div>
</div>
);
}
هناك نقاط مهمة يجب الانتباه إليها:
- اسم المكوّن يجب أن يبدأ بحرف كبير مثل
Linkلاlink. - يفضل إحاطة
JSXبين أقواس عند كتابته على أكثر من سطر. - يجب على كل مكوّن أن يعيد عناصر
JSXأو مكوّنات أخرى.
وبما أن المكوّنات يمكن أن تعيد مكوّنات أخرى، فمن الطبيعي إنشاء مكوّن أعلى يمثل التطبيق كاملاً، مثل App.
function Link() {
return (
<div>
<a href="https://reactjs.org">React - A JavaScript Library for Building User Interfaces</a>
<div><h3>reactjs.org</h3></div>
<div>React makes it painless to create interactive UIs.</div>
</div>
);
}
function App() {
return (
<section>
<Link />
<Link />
<Link />
</section>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
بهذه البنية تظهر لنا فكرة الشجرة في React، حيث يكون App مكوّناً أباً، وتكون عناصر Link أبناءً له.
مشكلة البيانات المتكررة: لماذا نحتاج إلى Props؟
عند استخدام <Link /> ثلاث مرات، سنحصل على ثلاث نتائج متطابقة إذا لم نمرر بيانات مختلفة لكل مكوّن. هنا تأتي Props، وهي الآلية التي تسمح بتمرير البيانات إلى المكوّنات.
في الدوال العادية، نمرر البيانات عبر الوسائط. وفي React نفعل الأمر نفسه، لكن باستخدام خصائص تبدو شبيهة بخصائص HTML.
function Link(props) {
return <a>{props.title}</a>;
}
تُخزَّن القيم المرسلة داخل كائن باسم props. ويمكن إدراج القيم داخل JSX باستخدام الأقواس المعقوفة {}.
function Link(props) {
return (
<div>
<a href={props.url}>{props.title}</a>
<div><h3>{props.shortUrl}</h3></div>
<div>{props.excerpt}</div>
</div>
);
}
تمرير بيانات مختلفة لكل مكوّن
function Link(props) {
return (
<div>
<a href={props.url}>{props.title}</a>
<div><h3>{props.shortUrl}</h3></div>
<div>{props.excerpt}</div>
</div>
);
}
function App() {
return (
<section>
<Link
title="React - A JavaScript Library for Building User Interfaces"
url="https://reactjs.org"
shortUrl="reactjs.org"
excerpt="React makes it painless to create interactive UIs."
/>
<Link
title="React (web framework) - Wikipedia"
url="https://en.wikipedia.org/wiki/React_(web_framework)"
shortUrl="en.wikipedia.org › wiki › React_(web_framework)"
excerpt="React is a JavaScript library for building user interfaces."
/>
<Link
title="React (@reactjs) | Twitter"
url="https://twitter.com/reactjs"
shortUrl="twitter.com › reactjs"
excerpt="The latest Tweets from React (@reactjs)."
/>
</section>
);
}
هذا الأسلوب يحسن مرونة المكوّن كثيراً، لكنه قد يجعل مكوّن App مزدحماً إذا كانت البيانات كثيرة.
فصل البيانات عن الواجهة لكتابة كود أنظف
أفضل ممارسة في التطبيقات الواقعية هي فصل البيانات عن بنية العرض. بدلاً من كتابة القيم داخل كل مكوّن مباشرة، يمكن وضع البيانات في مصفوفة من الكائنات، ثم توليد الواجهة منها.
const linkData = [
{
title: "React - A JavaScript Library for Building User Interfaces",
url: "https://reactjs.org",
shortUrl: "reactjs.org",
excerpt: "React makes it painless to create interactive UIs."
},
{
title: "React (web framework) - Wikipedia",
url: "https://en.wikipedia.org/wiki/React_(web_framework)",
shortUrl: "en.wikipedia.org › wiki › React_(web_framework)",
excerpt: "React is a JavaScript library for building user interfaces."
},
{
title: "React (@reactjs) | Twitter",
url: "https://twitter.com/reactjs",
shortUrl: "twitter.com › reactjs",
excerpt: "The latest Tweets from React (@reactjs)."
}
];
هذه الخطوة تجعل الكود أوضح، وتسهل نقل البيانات لاحقاً إلى ملف منفصل أو مصدر خارجي مثل API.
استخدام map() لعرض قائمة ديناميكية من المكوّنات
لعرض كل عنصر داخل المصفوفة، نستخدم الدالة map(). وهي من أكثر الأنماط شيوعاً في React عند بناء القوائم الديناميكية.
const linkData = [
{
title: "React - A JavaScript Library for Building User Interfaces",
url: "https://reactjs.org",
shortUrl: "reactjs.org",
excerpt: "React makes it painless to create interactive UIs."
},
{
title: "React (web framework) - Wikipedia",
url: "https://en.wikipedia.org/wiki/React_(web_framework)",
shortUrl: "en.wikipedia.org › wiki › React_(web_framework)",
excerpt: "React is a JavaScript library for building user interfaces."
},
{
title: "React (@reactjs) | Twitter",
url: "https://twitter.com/reactjs",
shortUrl: "twitter.com › reactjs",
excerpt: "The latest Tweets from React (@reactjs)."
}
];
function Link(props) {
return (
<div>
<a href={props.url}>{props.title}</a>
<div><h3>{props.shortUrl}</h3></div>
<div>{props.excerpt}</div>
</div>
);
}
function App() {
return (
<section>
{linkData.map(function(link) {
return (
<Link
key={link.url}
title={link.title}
url={link.url}
shortUrl={link.shortUrl}
excerpt={link.excerpt}
/>
);
})}
</section>
);
}
ReactDOM.render(<App />, document.getElementById("root"));
لاحظ هنا استخدام الخاصية key، وهي مهمة لمساعدة React على تتبع العناصر داخل القوائم بشكل صحيح عند التحديث.
مزايا هذا الأسلوب عملياً
- إضافة عدد غير محدود من النتائج دون تكرار البنية يدوياً.
- فصل البيانات عن الواجهة بشكل واضح.
- تسهيل الصيانة والتعديل لاحقاً.
- جعل التطبيق أكثر قابلية للتوسع.
كيف يفكر مطوّر React عند بناء الواجهات؟
الفكرة الأهم ليست فقط معرفة JSX أو Props أو map()، بل تعلّم طريقة التفكير نفسها. مطوّر React يبدأ عادة بتقسيم الواجهة إلى أجزاء صغيرة، ثم يسأل:
- ما العناصر التي تتكرر بصرياً؟
- ما الأجزاء التي يمكن تحويلها إلى مكوّنات قابلة لإعادة الاستخدام؟
- ما البيانات التي يجب تمريرها لكل مكوّن؟
- وأين يجب أن تُخزَّن هذه البيانات؟
كلما أصبحت أكثر قدرة على تحليل الواجهة بهذه الطريقة، ستتمكن من بناء تطبيقات أسرع وأكثر تنظيماً.

مقارنة سريعة بين HTML التقليدي وReact Components
| المعيار | HTML فقط |
React Components |
|---|---|---|
| إعادة الاستخدام | محدودة وتحتاج إلى نسخ متكرر | مرتفعة عبر المكوّنات |
| إدارة البيانات | بدائية في الصفحات الثابتة | مرنة وديناميكية عبر props |
| التوسع | أصعب مع زيادة العناصر | أسهل وأكثر تنظيماً |
| الصيانة | مرهقة عند التكرار | أبسط بفضل فصل المنطق عن العرض |
| ملاءمة التطبيقات التفاعلية | ضعيفة | ممتازة |
متى يكون استخدام React منطقياً؟
استخدام React يصبح خياراً ممتازاً إذا كنت تبني:
- واجهة تحتوي على عناصر متكررة كثيرة.
- تطبيقاً يعتمد على بيانات متغيرة.
- لوحات تحكم أو متاجر أو أنظمة بحث.
- مشروعاً يحتاج إلى توسع وصيانة على المدى الطويل.
أما إن كنت تنشئ صفحة تعريفية بسيطة وثابتة جداً، فقد يكون HTML التقليدي كافياً في البداية. الاختيار الصحيح يعتمد على حجم المشروع وتعقيده.
الخلاصة التقنية
الانتقال من HTML الثابت إلى مكوّنات React ليس مجرد تغيير في أسلوب الكتابة، بل هو انتقال إلى طريقة أكثر نضجاً في بناء الواجهات. فبدلاً من تكرار البنية نفسها مراراً، تسمح لك المكوّنات ببناء عناصر مرنة، قابلة لإعادة الاستخدام، ومدفوعة بالبيانات. من الناحية التقنية، هذه المقاربة تقلل التعقيد، وتحسن قابلية الصيانة، وتمنحك أساساً أقوى لبناء تطبيقات ويب حديثة قابلة للتوسع. لذلك، إذا كنت تطمح إلى تطوير واجهات احترافية وسريعة التطور، فإن تعلم React Components خطوة منطقية ومهمة للغاية.