Menu
flag Ar iconالعربيةdown icon

النماذج في React: الحقول ومربعات الاختيار وselect والتحقق

ابنِ النماذج في React بحقول متحكم بها: الحقول النصية وtextarea وselect ومربعات الاختيار وأزرار الاختيار الدائرية، وكائن حالة واحد لحقول كثيرة، والإرسال بـ onSubmit، وعرض أخطاء التحقق، وإجراءات النماذج في React 19.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

يحتفظ نموذج React بقيمة كل حقل في الحالة: يعرض الحقل value={state} ويحدّثها بـ onChange. وعندما يرسل المستخدم، يستدعي معالج onSubmit الدالة e.preventDefault() لمنع إعادة تحميل الصفحة ثم يستخدم القيم الموجودة أصلًا في الحالة.

اكتب اسمًا واضغط Enter أو انقر الزر. ثم احذف السطر e.preventDefault();: تعرض المعاينة الحقول التي كان المتصفح سيرسلها في إرسال أصلي، وهو ما كان سيعيد تحميل الصفحة أيضًا في صفحة حقيقية.

الحقل الذي تأتي قيمته من الحالة يُسمى حقلًا متحكمًا به. أما البديل، أي ترك DOM يحتفظ بالقيمة وقراءتها لاحقًا، فتتناوله صفحة المكوّنات المتحكم بها وغير المتحكم بها.

الحقول النصية وtextarea

يعمل كل حقل نصي بالطريقة نفسها: value من الحالة، وonChange يقرأ e.target.value. ويتبع <textarea> النمط نفسه. في HTML يوضع نصه بين الوسمين، أما في React فتمرره على أنه value.

لأنك تضبط القيمة بنفسك، يمكنك تغيير ما كتبه المستخدم قبل أن يظهر: يحوّل حقل العنوان كل حرف إلى حرف كبير. ويتحدث عدّاد المحارف مع كل ضغطة مفتاح لأن body حالة وكل تغيير يعيد العرض.

Select

يأخذ <select> القيمة value على عنصر select نفسه، لا selected على أحد الخيارات. وe.target.value هي value الخيار المحدد.

ولقائمة اختيار متعدد، أضف multiple ومرّر مصفوفة على أنها value. واقرأ الاختيارات بـ Array.from(e.target.selectedOptions, (o) => o.value).

مربع الاختيار والأزرار الدائرية

يُتحكم في مربع الاختيار بـ checked لا value، ويقرأ معالجه e.target.checked، وهي true أو false. وتتشارك الأزرار الدائرية في مجموعة واحدة الاسم name؛ ويكون كل منها محددًا عندما تساوي الحالة قيمته.

قراءة e.target.value على مربع اختيار خطأ شائع: لمربع اختيار بلا سمة value تُرجع النص "on" سواء أكان المربع محددًا أم لا.

كائن حالة واحد لحقول كثيرة

النموذج الذي فيه عشرة حقول لا يحتاج إلى عشرة استدعاءات لـ useState وعشرة معالجات. احتفظ بكائن واحد، وأعطِ كل حقل name يطابق مفتاحًا، واكتب معالجًا واحدًا يستخدم الاسم كمفتاح محسوب: [e.target.name].

يفحص المعالج نوع الحقل ليخزّن مربع الاختيار قيمة منطقية وتخزّن البقية نصًا. أضف حقلًا بإضافة مفتاح إلى الكائن الابتدائي وحقل بالاسم name نفسه؛ ولا يحتاج المعالج إلى أي تغيير. يُبقي النشر كل حقل آخر (راجع تحديث المصفوفات والكائنات).

إرسال نموذج

ضع منطق الإرسال على onSubmit الخاص بالنموذج، لا على onClick الخاص بالزر. يُطلق onSubmit أيضًا عندما يضغط المستخدم Enter في حقل نصي، وهو ما سيفوت معالج النقر. الزر <button> داخل نموذج زر إرسال افتراضيًا؛ أعطِ الأزرار الأخرى type="button" حتى لا ترسل.

افتح وحدة التحكم، واكتب كلمة مرور واضغط Enter: يسجّل النموذج الكائن كله. النقر على "Clear" لا يسجّل شيئًا، لأنه type="button". احذف تلك السمة فيبدأ Clear بالإرسال أيضًا.

التحقق وعرض الأخطاء

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

انقر Save والحقول فارغة لترى الرسالتين، ثم املأها. saveProfile بديل عن طلب حقيقي: ينتظر 800 جزء من الثانية ثم يُحل. تُطفئ السمة noValidate فقاعات التحقق الخاصة بالمتصفح فلا تظهر إلا رسائلك؛ احذفها وأضف required إلى حقل لتقارن.

يمكن أيضًا حساب الأخطاء أثناء العرض بدلًا من تخزينها، مثل const emailError = form.email && !form.email.includes('@')، الذي يعرض الرسالة أثناء الكتابة. اختر التوقيت الذي يناسب النموذج: عند الإرسال أهدأ، وأثناء الكتابة يعطي ملاحظات أسرع.

إجراءات النماذج في React 19

تضيف React 19 طريقة أخرى للتعامل مع النموذج. مرّر دالة إلى الـ prop المسماة action في النموذج. تمنع React إعادة تحميل الصفحة نيابة عنك وتستدعي الدالة مع كائن FormData يحمل كل حقل له name. لا تحتاج الحقول إلى حالة على الإطلاق: فهي غير متحكم بها، وتفرّغها React بعد انتهاء الإجراء.

اكتب تعليقك وانشره. تعرض القائمة نصك، ويعود الحقل إلى Nice docs: بعد أن يُحل الإجراء، تعيد React ضبط الحقول غير المتحكم بها إلى defaultValue الخاصة بها. يمكن للإجراء أن يكون غير متزامن، وأثناء تنفيذه تعامل React التحديث كانتقال.

لعرض حالة انتظار أو خطأ من الإجراء، غلّفه بـ useActionState، الذي يُرجع أحدث نتيجة، وإجراءً مغلّفًا للنموذج، وعلامة isPending. ويمكن لزر في عمق النموذج أيضًا قراءة حالة الانتظار بـ useFormStatus من react-dom:

import { useFormStatus } from 'react-dom';

function SubmitButton() {
    const { pending } = useFormStatus();
    return <button disabled={pending}>{pending ? 'Posting...' : 'Post'}</button>;
}

لا يُحمَّل useFormStatus في المحررات هنا، فلا يظهر إلا في هذه الكتلة الثابتة. يجب أن يُستدعى من مكوّن يُعرض داخل <form>، لا في المكوّن الذي يعرض النموذج.

كل من الحالة المتحكم بها مع onSubmit وإجراءات النماذج مع FormData يعمل في React 19. تناسب الحقول المتحكم بها النماذج التي تتفاعل أثناء الكتابة (التحقق المباشر، أو عدّاد المحارف، أو حقول يعتمد بعضها على بعض). وتناسب الإجراءات النماذج التي لا تحتاج فيها إلى القيم إلا عندما يرسل المستخدم.

الأسئلة الشائعة

كيف تحصل على قيمة حقل إدخال في React؟

خزّنها في الحالة وحدّثها من onChange: <input value={name} onChange={e => setName(e.target.value)} />. يكون النص الحالي حينها دائمًا في name. وفي مربعات الاختيار اقرأ e.target.checked بدلًا من e.target.value.

كيف تمنع النموذج من إعادة تحميل الصفحة في React؟

استدعِ e.preventDefault() في بداية معالج onSubmit. من دونه يجري المتصفح إرسالًا عاديًا للنموذج، ينتقل ويعيد تحميل الصفحة.

كيف تتعامل مع حقول كثيرة بحالة واحدة في React؟

احتفظ بكائن واحد في الحالة، وأعطِ كل حقل name يطابق مفتاحًا، واستخدم معالجًا واحدًا بمفتاح محسوب: setForm({ ...form, [e.target.name]: e.target.value }).

لماذا يستخدم textarea القيمة value بدلًا من children في React؟

في HTML يوضع نص textarea بين وسميه، أما في React فتمرره على أنه value (أو defaultValue)، بالطريقة نفسها التي في حقل الإدخال. بهذا يعمل كل حقل نصي في نموذج React بالطريقة نفسها.

ما هي إجراءات النماذج في React 19؟

في React 19 يمكنك تمرير دالة إلى <form action={fn}>. تمنع React إعادة تحميل الصفحة، وتستدعي الدالة مع FormData الخاص بالنموذج، وتعيد ضبط الحقول غير المتحكم بها عند انتهائها. ويضيف useActionState فوق ذلك علامة انتظار ونتيجة.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن