نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر

نوفيل
الرئيسيةالكورساتالتحديات⚔️ المبارزاتالمقالاتالأدواتتغريداتالمجتمع
دخولابدأ مجاناً
REA

منهج React Js

دليل مرجعي شامل

كل اللغات
مدرسة البرمجة/منهج React Js/Building Custom Hooks

Building Custom Hooks

Custom Hooks في ريأكتإنتاج هوك مخصصإعادة استخدام الكود Reactكورس React كاملReusable Logic Reactقواعد تسمية Custom Hooks

جدول مرجعي سريع

1

إنشاء الهوكس المخصصة (Building Custom Hooks)

العنصر الهندسيالهوكس المخصصة Custom Hooksالدوال العادية Utility Functions
إمكانية استدعاء هوكس أخرىنعم (يمكنها استخدام useState و useEffect و useRef وغيرها)لا (لا يمكنها استدعاء هوكس ريأكت نهائياً)
الهدف الأساسيمشاركة المنطق التفاعلي وحالة المكونات (Stateful Logic)مشاركة الحسابات والمنطق البرمجي المجرد (Stateless Logic)
قواعد التسمية الصارمةتبدأ حتماً بكلمة use الصغيرة (مثل useFetch و useLocalStorage)تسمية عادية بحسب وظيفة الدالة (مثل formatDate)
تأثيرها على الرندرةتغير الحالة داخل الهوك يسبب إعادة رندرة للمكون المستدعي لهلا تؤثر على رندرة المكونات وتعمل كمعالجة بيانات فقط

الشرح

كلما كبر حجم التطبيق، ستلاحظ تكرار منطق تفاعلي معين داخل أكثر من مكون. على سبيل المثال: جلب البيانات من الـ API، أو القراءة والتخزين في الـ localStorage، أو تتبع حالة اتصال الإنترنت.

تتيح لك الهوكس المخصصة (Custom Hooks) استخلاص هذا المنطق المتكرر ونقله إلى دالة مستقلة وقابلة لإعادة الاستخدام في أي مكان، مع الاحتفاظ بالقدرة الكاملة على استخدام هوكس ريأكت الأساسية مثل useState و useEffect داخلها.

1. القواعد الصارمة لبناء Custom Hook

  1. الاسم يتكون من كلمة use كبادئة: يجب أن يبدأ اسم الدالة بـ use صغيرة (مثال: useFetch, useAuth). هذه البادئة ضرورية لتتمكن أداة ESLint من تطبيق قواعد ريأكت الصارمة للهوكس.
  2. عزل المنطق فقط وليس الـ UI: الهوك المخصص يرجع بيانات أو دوال (Data or Functions) ولا يرجع عناصر JSX.
  3. الحالة مستقلة كلياً: استدعاء نفس الـ Custom Hook في مكونين مختلفين لا يعني أنهما يتشاركان نفس الـ State! كل مكون يمتلك نسخة مستقلة تماماً من الحالة في الذاكرة.

2. مثال تطبيقي قصير: بناء هوك useFetch

بدلاً من كتابة useEffect وحالات التحميل والخطأ في كل صفحة نجلب منها بيانات، ننشئ هوك مخصص موحد:

أ) تعريفي الهوك (useFetch.js):

useFetch.js

useFetch.js
1import { useState, useEffect } from 'react';
2
3function useFetch(url) {
4 const [data, setData] = useState(null);
5 const [isLoading, setIsLoading] = useState(true);
6 const [error, setError] = useState(null);
7
8 useEffect(() => {
9 setIsLoading(true);
10 fetch(url)
11 .then((res) => {
12 if (!res.ok) throw new Error('فشل جلب البيانات');
13 return res.json();
14 })
15 .then((data) => setData(data))
16 .catch((err) => setError(err.message))
17 .finally(() => setIsLoading(false));
18 }, [url]);
19
20 // إرجاع الأغراض ككائن أو مصفوفة
21 return { data, isLoading, error };
22}
23
24export default useFetch;

ب) استخدام الهوك المخصص داخل المكون:

javascript
1import useFetch from './useFetch';
2
3function CourseList() {
4 // اختصار عشرات الأسطر في سطر واحد نظيف!
5 const { data: courses, isLoading, error } = useFetch('https://api.nouvil.net/courses');
6
7 if (isLoading) return <p>جاري التحميل...</p>;
8 if (error) return <p>خطأ: {error}</p>;
9
10 return (
11 <ul>
12 {courses?.map((c) => (
13 <li key={c.id}>{c.title}</li>
14 ))}
15 </ul>
16 );
17}

3. مثال آخر: هوك الحفظ التلقائي في الـ LocalStorage

javascript
1import { useState, useEffect } from 'react';
2
3function useLocalStorage(key, initialValue) {
4 const [value, setValue] = useState(() => {
5 const saved = localStorage.getItem(key);
6 return saved ? JSON.parse(saved) : initialValue;
7 });
8
9 useEffect(() => {
10 localStorage.setItem(key, JSON.stringify(value));
11 }, [key, value]);
12
13 return [value, setValue];
14}

نصائح احترافية

  • —تجنب الخلط: Custom Hook ليس لـ "إعادة استخدام المكونات" بل لـ "إعادة استخدام المنطق"!
  • —إذا كانت غايتك هي إعادة استخدام شكل الواجهة أو زر معين، استخدم مكون ريأكت عادي (Regular Component) يرجع JSX.
  • —أما إذا كانت غايتك هي تشغيل كود تفاعلي خلف الكواليس (مثل تتبع حجم الشاشة عند الـ Resize، أو حفظ التوكن، أو معالجة المدخلات) لاستخدامه في أشكال واجهات مختلفة تماماً، فهنا يكون الـ Custom Hook هو خيارك الهندسي الأنسب والأعلى كفاءة!

الدرس السابق

جلب البيانات من السيرفر

الدرس التالي

دورة الحياة للذاكرة والوصول لعناصر الـ DOM عبر useRef

نوفيل

منصة تعليم البرمجة الأولى بالعربي. تعلم من الصفر حتى الاحتراف مع كورسات احترافية وتحديات ذكاء اصطناعي.

المنصة

  • الكورسات
  • التحديات
  • المقالات
  • الأدوات

الحساب

  • إنشاء حساب
  • تسجيل الدخول
  • لوحة التحكم
  • الملف الشخصي

روابط

  • سياسة الخصوصية
  • شروط الاستخدام
  • عن نوفيل
  • تواصل معنا

© 2026 نوفيل. جميع الحقوق محفوظة.

صُنع بـ في مصر