React Native / الأوصاف الأصلية والتفاعل المحلي / الدرس 5
إدخال النص والمسودات والتحقق
افصل النص القابل للتحرير من الأوامر المقبولة، واحفظ المسودة عند فشل يمكن التعافي منه.
في هذه الصفحة
أهداف الدرس
- يحوي حقل الإدخال المتحكم فيه مسودة تحرير
- حلّل عقد حدود صريحا واحدا
- اعتمد التغيير بعد نجاح التحقق فقط
يحوي حقل الإدخال المتحكم فيه مسودة تحرير
يمكن أن يستقبل TextInput نص value وأن يبلغ عن التعديلات عبر onChangeText. النص مسودة، وليس كمية مجال صحيحة بالفعل. يحتاج المستخدم إلى حالات وسيطة مثل حقل عدد مطلوب فارغ أثناء التصحيح. افصل المسودة عن السجل المحفوظ، وحدّد معنى الحفظ والإلغاء قبل ربط العمل البعيد. ولوحة المفاتيح الرقمية تلميح إدخال وليست أداة تحقق؛ فقد يقدم اللصق واللوح الخارجي والقيم البرمجية نصا غير متوقع. تساعد التسميات المستمرة ورسائل الخطأ القابلة للمعالجة على فهم القاعدة دون الاعتماد على تلميح يختفي.
حلّل عقد حدود صريحا واحدا
يقبل البرنامج الأول أرقاما عشرية من ASCII بعد حذف المسافات المحيطة المسموح بها. ثم يفحص التمثيل الصحيح الآمن ونطاقا توضيحيا من1 إلى20 مقعدا. النطاق قاعدة منتج مصطنعة، وليس حدا عاما للحجز. ميّز فشل التنسيق المحلي من فشل السعة أو الصلاحية البعيد. يمكن لمحلّل أدق إرجاع فئات مختلفة للغياب والنص المعيب والخروج عن النطاق؛ ويجمعها المثال عمدا في رمز خطأ ثابت واحد. تربط رسائل المستخدم المترجمة بذلك الرمز قرب العرض، بدلا من مطابقة تسمية الحقل الحرفية.
function parseSeats(raw) {
const text = typeof raw === 'string' ? raw.trim() : '';
if (!/^[0-9]+$/.test(text)) return {ok: false, error: 'INVALID_SEATS'};
const value = Number(text);
return Number.isSafeInteger(value) && value >= 1 && value <= 20
? {ok: true, value} : {ok: false, error: 'INVALID_SEATS'};
}
console.log(JSON.stringify(parseSeats(' 04 ')));
console.log(JSON.stringify(parseSeats('21')));
console.log(JSON.stringify(parseSeats('4x')));
{"ok":true,"value":4}
{"ok":false,"error":"INVALID_SEATS"}
{"ok":false,"error":"INVALID_SEATS"}
القيمة المقبولة للأمر هي العدد4، بينما قد يبقى تمثيل التحرير04. ولا يصبح النص المعيب قيمة عددية بديلة مختلقة.
اعتمد التغيير بعد نجاح التحقق فقط
تستقبل الوحدة الثانية المحلّل اعتمادا صريحا، وتفصل المسودة والرسالة والمعاينة المقبولة. يغير التفعيل بمدخل معيب الرسالة ويحفظ المعاينة المقبولة السابقة. ينشئ الزر معاينة محلية فقط ولا يحفظ عبر الشبكة. وفي النموذج الفعلي، يجب أن تمنع حالة الانتظار تكرار التفعيل أو تحدّد سلوكه، وينبغي عادة لفشل الحفظ البعيد حفظ نص المسودة المفيد. لا تعدّل نموذجا محفوظا مشتركا مع كل حرف إذا كان الإلغاء يفترض إسقاط التعديلات. وتوفر بيئة التطبيق اعتماد المحلّل.
import {useState} from 'react';
import {View, Text, TextInput, Button} from 'react-native';
export default function SeatForm({parseSeats}) {
const [draft, setDraft] = useState('');
const [accepted, setAccepted] = useState(null);
const [message, setMessage] = useState('');
function preview() {
const result = parseSeats(draft);
if (!result.ok) { setMessage('Enter 1 through 20 seats'); return; }
setAccepted(result.value);
setMessage('Preview ready');
}
return <View>
<Text>Seats</Text>
<TextInput accessibilityLabel="Seats" value={draft}
onChangeText={setDraft} keyboardType="number-pad" />
<Button title="Preview" onPress={preview} />
<Text>{message}</Text>
{accepted !== null ? <Text>Seats: {accepted}</Text> : null}
</View>;
}
A valid04 draft predicts Preview ready and Seats: 4; invalid input predicts the range message.
يتبع المحلّل المقدم عقد النموذج السابق. ولم تُنفذ لوحة مفاتيح أو عارض مكونات أو نموذج أصلي.
صمّم التصحيح وسلوك لوحة المفاتيح معا
ينبغي أن يوضح خطأ الحقل ما يمكن تصحيحه، وأن يبقى مرتبطا بالمدخل المعني. اختر إجراءات الإرسال ونقل التركيز وفقا للوحة المفاتيح والهدف المدعومين، مع إبقاء تحكم إرسال مرئي. يحتاج سلوك KeyboardAvoidingView وتركيب التمرير إلى مراجعة خاصة بالمنصة؛ ولا تثبت إضافته عميانا بقاء الإجراء الرئيسي قابلا للوصول. لحقل كلمة المرور أو غيره من الحقول الحساسة قواعد تطبيع وتخزين تختلف عن تسمية عرض عامة. لا تشذب الأسرار أو تحولها لمجرد أن محلّل المقاعد يحذف مسافات مسموحة. احفظ دلالة التحرير وتحقق عند حد الأمر المقبول.
اختبر القواعد المحلية مستقلة عن النتائج البعيدة
اختبر النص الفارغ والصفر وطرفي النطاق المقبول وقيمة أعلى من الحد مباشرة والأصفار البادئة والمدخل الملصوق المعيب. تحقّق من أن التصحيح يحدث الرسالة دون تدمير المسودة. قد ترفض خدمة معتمدة عددا صحيحا محليا بعد تغير التوافر أو التفويض. ميّز تلك النتيجة وسوِّ الكتابات غير المؤكدة بدلا من الإعادة العمياء. لا يثبت اختبار محلّل نقي في Node التركيز أو تجنب لوحة المفاتيح أو إعلانات قارئ الشاشة أو تحقق الخادم. سجّلها فحوص هدف مستقلة؛ ولا تنفذ الدورة نموذجا أصليا أو تتصل بخدمة حجز.
الأخطاء الشائعة وإصلاحها
افتراض صحة القيمة لأن لوحة المفاتيح رقمية
- لماذا يحدث؟
- حل تلميح لوحة المفاتيح محل التحليل وفحص النطاق.
- كيف تصلحه؟
- تحقّق من المسودة المرسلة عبر محلّل صريح.
- كيف تتجنب تكراره؟
- أدرج نصا ملصوقا معيبا وأعدادا غير آمنة.
عجز الإلغاء عن التراجع عن تعديلات المحفوظ
- لماذا يحدث؟
- حدّث الحقل النموذج المعتمد مباشرة.
- كيف تصلحه؟
- حرر مسودة مستقلة واعتمدها بأمر حفظ مقصود.
- كيف تتجنب تكراره؟
- حدّد الإلغاء قبل اختيار ملكية الحالة.
محو فشل الحفظ نصا مفيدا
- لماذا يحدث؟
- صُفّرت المسودة قبل تأكيد النجاح.
- كيف تصلحه؟
- احفظها حتى النجاح أو إلغاء المستخدم الصريح.
- كيف تتجنب تكراره؟
- اختبر نتائج الحفظ المرفوضة وغير المؤكدة.
اختبر فهمك
1. لماذا يفيد إبقاء 04 في المسودة مع قبول القيمة العددية 4؟
اعرض الحل المشروح
يؤدي تمثيل التحرير وقيمة المجال غرضين مختلفين. يستطيع المستخدم تصحيح النص دون أن تصبح كل ضغطة مفتاح كمية محفوظة، بينما يستقبل الأمر عددا صحيحا متحققا منه. لا تطبّع إلا وفقا لعقد الحقل الموثق؛ ولا تطبق القاعدة العددية على نص حساس غير مرتبط.
2. ماذا ينبغي أن يحدث بعد معاينة صحيحة إذا كانت المسودة التالية 21؟
اعرض الحل المشروح
وفقا للعقد المعروض، يعرض التحقق خطأ النطاق ويترك آخر معاينة مقبولة كما هي. يستطيع المنتج بدلا من ذلك إخفاء المعاينات المتقادمة أثناء التحرير، لكن يجب نمذجة هذا القرار عمدا. يجب ألا يُختزل المدخل غير الصالح بصمت إلى 20، أو يستبدل الحالة المقبولة بالقيمة 21.
أهم ما تعلمته
- يحوي حقل الإدخال المتحكم فيه مسودة تحرير
- اختبر القواعد المحلية مستقلة عن النتائج البعيدة