React / المكونات والحالة / الدرس 5
النماذج المضبوطة وحدود التحقق
نسق الإدخال والإرسال والرسائل الميسرة دون خلط حالة النموذج بالبيانات الموثوقة.
في هذه الصفحة
أهداف الدرس
- اختيار مالك لقيمة الإدخال
- تحديث الحقل المضبوط فورا
- اختبار التحرير والتعافي
اختيار مالك لقيمة الإدخال
يتلقى الحقل المضبوط value من الحالة ويبلغ onChange بالتعديل، فحدثها بالقيمة الحالية ليستجيب. يملك DOM قيمة غير المضبوط ويمكن defaultValue ابتدائية. لا تنتقل عرضيا بين undefined ونص؛ اختر تمثيلا ثابتا كالنص الفارغ. لا يحدد اختيار المالك موضع التحقق النهائي؛ يحتاج النهجان عقد إرسال وثقة.
فصل النص عن قيم المجال
قد يحتوي الحقل العددي نصا انتقاليا أثناء التحرير. يفسد التحويل الفوري الفراغ والحالات الجزئية؛ احفظ النص وحلل عند حد مقصود ثم افحص المجال والوحدة والإلزام. تحسن سمات المتصفح التفاعل ولا تثبت ثقة الخادم. يستخدم checkbox خاصية checked وقيمتها بينما النص value. وتحتاج التسميات معرفات والرسائل علاقات ومعنى يتجاوز اللون.
تحديث الحقل المضبوط فورا
يعكس المثال الاسم بتحية ويهيئ نصا ويحدثه من target.value. يبقى التحرير العاجل مباشرا لا Transition؛ فالأخيرة ليست لحالة تتحكم بالكتابة. تستخدم التحية بديلا عند الفراغ دون تغيير النص المخزن، فينفصل العرض عن قيمة التحرير ولا يعاد كتابة المدخل كل عرض.
import { useState } from "react";
export default function App() { const [name, setName] = useState(""); return <main><h1>Hello, {name || "Guest"}</h1><label htmlFor="name">Name</label><input id="name" value={name} onChange={e => setName(e.target.value)} /></main>; }
Initial: Hello, Guest. Typing Mira: Hello, Mira.
تبقى القيمة نصا وتتبعها التحية دون Effect.
ملكية الإرسال والنتيجة
يمنع المثال التنقل الافتراضي ويفحص قاعدة كمية محلية ويعرض النتيجة دون خدمة أو حفظ. ينسق التطبيق الانتظار وتحقق الخادم والنتيجة المجهولة والتكرار. حدد أنواع الأزرار لمنع إرسال مساعد عرضي. طابق aria-invalid والرسالة واربط الوصف. يجب أن يعني النجاح نجاح العملية فعلا لا مجرد نقر.
import { useState } from "react";
export default function App() { const [text, setText] = useState(""); const [message, setMessage] = useState(""); function submit(e) { e.preventDefault(); const valid = /^[1-9][0-9]*$/.test(text); setMessage(valid ? "Quantity accepted locally" : "Enter a positive whole number"); } return <main><h1>Quantity</h1><form onSubmit={submit}><label htmlFor="qty">Quantity text</label><input id="qty" value={text} onChange={e => setText(e.target.value)} aria-describedby="result" /><button type="submit">Check</button><p id="result">{message}</p></form></main>; }
Submitting empty text: Enter a positive whole number. Submitting 3: Quantity accepted locally.
يفحص المثال الصيغة عند الإرسال ويبلغ قبولا محليا دون شبكة.
اختبار التحرير والتعافي
اختبر الفراغ والنص واللصق والتسميات الطويلة والرفض والتصحيح والمفاتيح. الرفض دون طريق إصلاح ناقص. احفظ القيم الآمنة وانقل التركيز بسياسة كملخص مفيد. تحتاج أخطاء الخادم والانقطاع رسائل. قد تعيد المفاتيح والمواضع ضبط الحقول، فافحص الهوية والأسماء مع الخطأ لا الشكل الافتراضي فقط.
الأخطاء الشائعة وإصلاحها
لا تغير الكتابة الحقل
- لماذا يحدث؟
- قيمة مضبوطة دون تحديث.
- كيف تصلحه؟
- حدث onChange أو اختر DOM مالكا.
- كيف تتجنب تكراره؟
- اختبر الكتابة.
يظهر تحذير نمط التحكم
- لماذا يحدث؟
- تحولت undefined لنص.
- كيف تصلحه؟
- هيئ نوعا ثابتا واحفظه.
- كيف تتجنب تكراره؟
- اختبر التحميل والمسح.
يوهم النجاح المحلي بالحفظ
- لماذا يحدث؟
- فُحصت الصيغة فقط.
- كيف تصلحه؟
- صف المحلي بدقة وانتظر النتيجة الحقيقية.
- كيف تتجنب تكراره؟
- افصل التحقق والحفظ.
اختبر فهمك
1. لماذا يخزن حقل كمية نصا رغم أن المجال عدد صحيح؟
اعرض الحل المشروح
يشمل التحرير الفراغ والجزئي غير النهائي. احفظ النص ثم حلله وتحقق عند الحد، لمنع تحويل الفراغ لصفر أو مسح التعديل الوسيط.
2. ماذا توضح حالة انتظار الإرسال؟
اعرض الحل المشروح
توضح العمل الجاري وتمنع التكرار أو تصالحه بسياسة وتحفظ التعافي، ولا تعلن النجاح مبكرا. احفظ الاسم والتركيز المفهومين.
أهم ما تعلمته
- اختر مالك الإدخال عن قصد.
- ليس نص التحرير بيانات مجال موثوقة.
- أبلغ النتائج الحقيقية برسائل ميسرة.