انتقل إلى محتوى الدرس
الدرس 24
دورة ReactJS

إدارة النماذج متعددة الحقول والتحقق من المدخلاتMulti-Field Forms and Input Validation

نظّم النماذج متعددة الحقول في كائن حالة موحد، وأجّل رسائل التحقق بحدث onBlur وتتبع اللمس مع سمات الإتاحة القياسية، وافصل بين تحسين الواجهة وأمان الخادم.
أقسام الدرس
6
الأمثلة
5
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
0
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

عندما يتوسع نموذج التسجيل أو الدفع ليضم خمسة أو عشرة حقول، يصبح تعريف عشرة متغيرات useState() منفصلة وعشر دوال معالجة متشابهة عبئاً يضعف مقروئية المكون. الحل الهندسي النظيف هو جمع حقول النموذج المترابطة في كائن حالة واحد.

امنح كل حقل خاصية name مطابقة لمفتاحه في الكائن، واستخدم معالج تغيير موحداً يعتمد خاصية المفتاح المحسوب: setForm((prev) => ({ ...prev, [name]: nextValue })).

HTML
function handleChange(e) {
  const { name, type, value, checked } = e.target;
  setForm((prev) => ({
    ...prev,
    [name]: type === 'checkbox' ? checked : value,
  }));
}

يُعد إظهار رسائل الخطأ الحمراء في وجه المستخدم قبل أن يلمس الحقل — أو وهو لا يزال في منتصف كتابة بريده الإلكتروني — تجربة مزعجة للغاية. يطبق مهندسو الواجهات المحترفون قاعدة «تأجيل التنبيه، والتبرئة الفورية».

تتبع حالة لمس الحقول في كائن touched عند انطلاق حدث مغادرة الحقل onBlur (أو عند محاولة الإرسال)، فلا تعرض رسالة الخطأ إلا للحقل الذي غادره المستخدم فعلاً، وأخفِها لحظياً فور تصحيحه للإدخال.

HTML
const [email, setEmail] = useState('');
const [touched, setTouched] = useState(false);
const isInvalid = !email.includes('@');
const showError = touched && isInvalid;

اكتب قواعد الفحص داخل دالة نقية مساعدة validateForm(values) تفحص قيم الكائن الحالي وتعيد كائن أخطاء يربط اسم كل حقل برسالة إرشادية واضحة قابلة للتنفيذ، مثل تحديد الحد الأدنى لطول كلمة المرور بدلاً من عبارة غامضة.

ولأن التحقق المحلي فوري وحتمي، استدعِ const errors = validateForm(form) مباشرة أثناء التصيير بدلاً من تخزين الأخطاء في متغير حالة إضافي قد ينفصل عن القيم الفعلية.

مسار التحقق من النماذج في 4 مراحل: تحديث كائن الحالة ثم رصد مغادرة الحقل ثم حساب الأخطاء وسمات الإتاحة ثم التحقق الملزم في الخادم
HTML
function validateSignup(values) {
  const errors = {};
  if (values.username.trim().length < 3) {
    errors.username = 'Minimum 3 characters required.';
  }
  if (values.password.length < 8) {
    errors.password = 'Use 8 or more characters.';
  }
  return errors;
}

الاعتماد على اللون الأحمر وحده لتمييز الحقل الخاطئ لا يظهر لمستخدمي قارئات الشاشة المكفوفين ولا لمن يعانون ضعف تمييز الألوان. يتطلب التحقق المتاح قياسياً ربط سمتين من معيار WAI-ARIA بمعرّف مولد عبر useId():

  • سمة aria-invalid لإبلاغ التقنيات المساعدة بأن الحقل الحالي يحوي خطأً.
  • سمة aria-describedby مربوطة بمعرّف فقرة رسالة الخطأ حتى تُقرأ إرشادات التصحيح صوتياً تلقائياً.
HTML
<input
  id={fieldId}
  aria-invalid={showErr}
  aria-describedby={showErr ? errId : undefined}
  value={slug}
  onChange={(e) => setSlug(e.target.value)}
/>
{showErr && <p id={errId} role="alert">{errMsg}</p>}

لا تحتاج كل النماذج إلى تتبع كل حرف في الحالة؛ فعندما يقتصر الغرض من نموذج بسيط على قراءة القيم لحظة الإرسال فقط دون عدادات حية أو شروط فورية، يمكنك قراءة الحقول مباشرة عبر واجهة FormData القياسية في المتصفح.

مرر العنصر e.currentTarget إلى new FormData(e.currentTarget) وحوّل المدخلات إلى كائن نظيف عبر Object.fromEntries() اعتماداً على خاصية name لكل حقل.

HTML
function handleFeedbackSubmit(e) {
  e.preventDefault();
  const fd = new FormData(e.currentTarget);
  const payload = Object.fromEntries(fd.entries());
  setSubmittedData(payload);
  e.currentTarget.reset();
}

ثمة قاعدة هندسية وأمنية حاسمة لا تقبل التهاون في أي تطبيق حقيقي وهي أن التحقق داخل مكونات React يهدف لتحسين تجربة المستخدم فقط، ولا يُعد حماية أمنية مطلقاً؛ إذ يمكن لأي شخص تجاوز المتصفح وإرسال طلبات HTTP مباشرة إلى الخادم.

لذلك يجب تطبيق جميع قواعد التحقق والصلاحيات وفحص تكرار البريد وتنظيف البيانات على الخادم الخلفي إلزامياً، مع عرض أي أخطاء يعيدها الخادم بوضوح في واجهة النموذج. يوضح الجدول التالي تكامل الطبقتين:

بُعد المقارنةتحقق الواجهة في Reactالتحقق الخلفي في الخادم
الهدف الأساسيإرشاد لحظي سريع يجنب المستخدم انتظار الشبكةحماية أمنية إلزامية وضمان سلامة قاعدة البيانات
إمكانية التجاوزنعم عبر أدوات المطور أو إرسال طلب مباشرلا يمكن تجاوزه لأنه يعمل في بيئة الخادم الموثوقة
أمثلة الفحوصاتالحقول الفارغة وطول النص وصيغة البريدالصلاحيات وعدم تكرار السجلات وتطهير المدخلات
توقيت التنفيذأثناء الكتابة وعند مغادرة الحقل وقبل الإرسالعند استلام كل طلب تعديل أو إنشاء وارد للخادم
خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

جمعت في هذا الدرس حقول النماذج المتعددة في كائن حالة موحد، وضبطت توقيت رسائل الخطأ بحدث onBlur وتتبع اللمس، وربطت سمات الإتاحة لقارئات الشاشة، واستخدمت FormData للنماذج البسيطة مع ترسيخ الفارق بين تحقق الواجهة وأمان الخادم. الخطوة التالية: انتقل الآن إلى الدرس رقم 25 «تصميم هيكل الحالة وحساب القيم المشتقة» لمواصلة البناء التراكمي المتدرج في مسار React الحديث.

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 Computed Property Name اسم الخاصية المحسوب
صياغة كائنات حديثة [name]: value تتيح تحديث المفتاح المطابق لاسم الحقل ديناميكياً داخل الحالة.
للمراجعة
02 Touched State حالة لمس الحقل
تتبع ما إذا كان المستخدم قد تفاعل مع الحقل وغادره عبر onBlur لمنع ظهور رسائل الخطأ قبل أوانها.
للمراجعة
03 Accessible Error Binding ربط الخطأ المتاح صوتياً
الجمع بين سمتي aria-invalid وaria-describedby لتمكين قارئات الشاشة من نطق حالة الخطأ وسببه.
للمراجعة
04 FormData API واجهة FormData
كائن متصفح قياسي يستخرج قيم الحقول المسماة مباشرة من عنصر النموذج لحظة الإرسال.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 ARIA ARIA
Accessible Rich Internet Applications
سمات قياسية عالمية تنقل حالات التحقق والأخطاء التفاعلية بوضوح إلى التقنيات المساعدة.
للمراجعة
02 UX UX
User Experience
جودة وسلاسة تجربة المستخدم أثناء تعبئة النموذج وتلقي الإرشادات التصحيحية.
للمراجعة
03 WCAG WCAG
Web Content Accessibility Guidelines
إرشادات إتاحة محتوى الويب العالمية التي تشترط عدم الاكتفاء باللون وحده للإشارة إلى الأخطاء.
للمراجعة
04 HTTP HTTP
Hypertext Transfer Protocol
بروتوكول الشبكة الذي يمكن عبره إرسال طلبات مباشرة للخادم متجاوزة فحوصات المتصفح.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. افتح مثال UnifiedAccountForm وأضف خاصية jobTitle للكائن مع حقل إدخال يحمل نفس خاصية name مستخدماً نفس دالة التغيير الموحدة.

  2. افتح مثال AccessibleSlugInput وأدخل مسافات أو أحرفاً كبيرة لملاحظة رسالة التنبيه ثم صححها بشرطات لمراقبة تحول الحالة إلى صالحة.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

10أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي10 أسئلة تنتظرك
01

ما الصياغة الحديثة التي تتيح لدالة تغيير واحدة تحديث الحقل المطابق لخاصية e.target.name داخل كائن الحالة؟

تسمح أسماء الخصائص المحسوبة بتحديث المفتاح الموافق لاسم الحقل ديناميكياً مع الحفاظ على بقية الحقول.

02

أي حدث في React يُستخدم عادةً لتسجيل أن المستخدم قد غادر الحقل لتفعيل التحقق المهذب؟

ينطلق حدث onBlur فور انتقال التركيز خارج الحقل مما يجعله مثالياً لتسجيل لمس الحقل.

03

يمكن حساب رسائل التحقق المتزامنة مباشرة أثناء التصيير من حالة النموذج الحالية دون الحاجة لتخزين متغير حالة مكرر للأخطاء.

صواب؛ حساب الأخطاء مباشرة أثناء التصيير يمنع أي تضارب بين القيم الحالية ورسائل الخطأ.

04

أي زوج من سمات الإتاحة يربط الحقل غير الصالح برسالة الخطأ المرئية ليقرأها قارئ الشاشة؟

تعلن aria-invalid وجود الخطأ بينما تشير aria-describedby إلى معرّف فقرة التوضيح.

05

إضافة تحقق شامل ودقيق داخل مكون النموذج في React يغني تماماً عن التحقق من البيانات في الخادم الخلفي.

خطأ؛ يمكن تجاوز فحوصات المتصفح بسهولة عبر طلبات الشبكة المباشرة لذا يظل تحقق الخادم إلزامياً للأمان.

06

عند استخراج بيانات نموذج بسيط عبر new FormData(e.currentTarget)، ما السمة الواجب توفرها على كل حقل؟

يجمع كائن FormData القيم اعتماداً على سمة الاسم name الموضوعة على كل عنصر نموذج.

07

داخل دالة التغيير الموحدة التي تعالج الحقول النصية وخانات الاختيار معاً، كيف نختار القيمة الصحيحة؟

نفحص نوع الحقل فإذا كان checkbox نأخذ checked وإلا نأخذ value.

08

يكفي تلوين إطار الحقل باللون الأحمر دون نص توضيحي أو سمات ARIA لتحقيق إتاحة كاملة للنموذج.

خطأ؛ اللون وحده لا يظهر لمستخدمي قارئات الشاشة ولا يحقق معايير الإتاحة العالمية.

09

ماذا يعني مبدأ تجربة المستخدم «تأجيل التنبيه والتبرئة الفورية» في النماذج التفاعلية؟

انتظار مغادرة الحقل أو الإرسال قبل إظهار الخطأ ثم إخفاؤه فوراً بمجرد أن يصبح الإدخال صحيحاً.

10

متى يكون استخدام الحالة المحكومة useState أفضل من الاكتفاء بقراءة FormData عند الإرسال؟

كلما تطلبت الواجهة تفاعلاً لحظياً مع كل حرف مثل عدادات الأحرف وقوائم شروط كلمة المرور الحية.