React Native / الأوصاف الأصلية والتفاعل المحلي / الدرس 4
الأحداث ولقطات الحالة والتحديثات دون تعديل الأصل
أبق نية المستخدم في معالجات الأحداث، واشتق الواجهة التالية من لقطة حالة معتمدة واحدة.
في هذه الصفحة
أهداف الدرس
- يقرأ العرض لقطة حالة
- مرّر المعالج لا نتيجة استدعائه الفوري
- استبدل المجموعات المملوكة بدلا من تعديل اللقطات
يقرأ العرض لقطة حالة
تستدعي React المكوّن بخصائص وحالة ذلك العرض. يطلب تعيين الحالة عرضا لاحقا، ولا يعيد كتابة المتغير المحلي الذي التقطه المعالج الحالي. عندما تعتمد التالية على السابقة، استخدم محدثا داليا لكي تتراكب الانتقالات المنتظرة صحيحا. لا تنفذ التنقل أو الاشتراك أو الكتابة أثناء حساب JSX. فقد يتكرر العرض دون أن يمثل فعلا جديدا للمستخدم. اجعل الحدث المالك للعملية ظاهرا، واشتق التسميات والمجاميع من الحالة المقبولة الحالية بدلا من نسخ متغيرة زائدة قد تتباعد.
مرّر المعالج لا نتيجة استدعائه الفوري
تقدم الوحدة الأولى دالة إلى onPress في Pressable. أما استدعاؤها أثناء العرض فيطلب تغيير الحالة قبل التفعيل، وقد يسبب عرضا متكررا. يعبّر المحدث الدالي عن زيادة واحدة من أحدث قيمة منتظرة. يعالج Pressable حالة التفاعل، بينما يحدد accessibilityRole وتسمية مفيدة معنى الإجراء. ولا يصبح View منسق بإيماءة زرا ميسرا مكافئا تلقائيا. العدد الأول المتوقع صفر، ويطلب تفعيل واحد القيمة واحدا. ويظل تسليم الضغط والتركيز والتغذية المنطوقة غير منفذ في البيئة.
import {useState} from 'react';
import {Pressable, Text} from 'react-native';
export default function App() {
const [count, setCount] = useState(0);
return <Pressable accessibilityRole="button" accessibilityLabel="Add one"
onPress={() => setCount(previous => previous + 1)}>
<Text>Count: {count}</Text>
</Pressable>;
}
Initially Count: 0; after one activation, the next description is Count: 1.
يطلب المعالج تحديثا بدلا من تعديل count. الوحدة تفاعل أصلي توضيحي، وليست اختبار React منفذا.
استبدل المجموعات المملوكة بدلا من تعديل اللقطات
ينمذج المثال الثاني الاختيار بمعرّف مستقر. ينشئ مصفوفة جديدة عند الإضافة والإزالة ويحفظ اللقطة السابقة دون تعديل. يستطيع مالك React استخدامه داخل محدث دالي. ولا تحمي النسخة السطحية تلقائيا الكائنات الداخلية المتغيرة؛ فتحتاج التحديثات المتداخلة سياسة ملكية. ويمنع حفظ المعرّفات اختيار صف آخر بصمت عند إعادة ترتيب قائمة بدلا من فهرسها القديم. لا يثبت البرنامج النقي إلا انتقالات القيم المحلية عند تنفيذه في Node، ولا يثبت إعادة عرض مكوّن أصلي.
function toggleId(selected, id) {
return selected.includes(id) ? selected.filter(value => value !== id) : [...selected, id];
}
const before = ['w-7'];
const after = toggleId(before, 'w-9');
console.log(JSON.stringify(before));
console.log(JSON.stringify(after));
console.log(JSON.stringify(toggleId(after, 'w-7')));
["w-7"]
["w-7","w-9"]
["w-9"]
تحتفظ اللقطة الأصلية بـ w-7. وتنتج إضافة w-9 وإزالة w-7 مصفوفتين مستقلتين بعضوية واضحة.
اختر عمر الحالة وفقا للتفاعل
يمكن أن ينتمي علم كشف محلي إلى ظهور واحد للمكوّن، بينما قد تحتاج بيانات الحساب إلى مالك أوسع. تؤثر المفاتيح وموضع الشجرة في حفظ React للحالة المحلية عند تغير الأوصاف. لا تولد مفتاحا جديدا في كل عرض لفرض تحديث؛ فقد يصفر مسودة بدلا من إصلاح الملكية. يحتاج المحرر القابل للإلغاء غالبا إلى مسودة مستقلة عن السجل المشترك المحفوظ. حدّد الحفظ والإلغاء قبل وصل مسار تحديث مباشر شبيه بالرابط بالبيانات المعتمدة. لا تستطيع مكتبة إدارة الحالة تقرير هذه الدلالات للعمر والأوامر تلقائيا.
افحص النية والانتقالات والنتائج المرئية مستقلة
يفحص اختبار نموذج مفيد اللقطة السابقة والقيمة التالية وثوابت مثل تفرد معرّفات الاختيار. ثم ينبغي لاختبار مكوّن مجهز تفعيل التحكم العام وفحص الوصف المعتمد، وليس عد استدعاءات الدوال العرضية. أدرج التفعيل السريع المتكرر وإعادة عرض أب غير مرتبطة بالمهمة. وإذا كان الأمر غير متزامن، فحدّد الانتظار وسلوك التفعيل المكرر، بدلا من افتراض أن تحديث الحالة يجعل العمليات البعيدة فريدة. يحسن التحكم المعطل التفاعل، لكنه لا يفرض تفويض الخادم أو خاصية ثبات أثر العملية عند تكرارها (idempotency). لا يُنفذ عارض React أو تفاعل أصلي لمقتطفات مكونات الدورة.
الأخطاء الشائعة وإصلاحها
تشغيل onPress أثناء العرض
- لماذا يحدث؟
- استقبلت الخاصية نتيجة استدعاء بدلا من دالة رد نداء.
- كيف تصلحه؟
- مرّر دالة تنفذ فعل الحدث عند التفعيل.
- كيف تتجنب تكراره؟
- راجع وسائط المعالجات لاستدعاء فوري عرضي.
تغير الاختيار دون إعادة عرض موثوقة
- لماذا يحدث؟
- عُدلت المصفوفة وأعيد المرجع نفسه للحالة.
- كيف تصلحه؟
- أعد مجموعة مملوكة جديدة من المحدث.
- كيف تتجنب تكراره؟
- افحص بقاء اللقطات السابقة دون تغيير.
اختفاء مسودة نموذج بعد تحديث بسيط
- لماذا يحدث؟
- استبدل مفتاح متغير هوية المكوّن.
- كيف تصلحه؟
- استخدم هوية مستقرة وضع المسودة لدى مالكها المقصود.
- كيف تتجنب تكراره؟
- أعد عرض الأب أثناء وجود مدخل.
اختبر فهمك
1. لماذا قد تُظهر قراءة count مباشرة بعد setCount القيمة القديمة؟
اعرض الحل المشروح
يغلق المعالج على لقطة الحالة الخاصة بعرضه الحالي. يجدول المعيّن عرضا مستقبليا، ولا يعيد كتابة ذلك المتغير الملتقط. استخدم محدثا داليا للانتقالات التي تعتمد على السابقة، وافحص الواجهة التالية المعتمدة داخل بيئة اختبار مناسبة.
2. أين ينبغي حفظ الاختيار عندما يجب أن يتفق عرضا قائمة عليه؟
اعرض الحل المشروح
ضع مجموعة معتمدة واحدة من المعرّفات المختارة لدى أقرب مالك مشترك مناسب، أو في نموذج تطبيق أوسع بعمر محدد. مرّر القيم والأوامر إلى العرضين. تنشئ نسختان قابلتان للتعديل مستقلا التزامات مزامنة، وقد تتباعدان بعد التحديث أو التنقل.
أهم ما تعلمته
- يقرأ العرض لقطة حالة
- افحص النية والانتقالات والنتائج المرئية مستقلة