React / المكونات والحالة / الدرس 3
الأحداث ولقطات الحالة
اربط أفعال المستخدم بتحديث الحالة مع فهم القيم المحفوظة لكل عرض.
في هذه الصفحة
أهداف الدرس
- الحدث حد مقصود
- طلب تحديث من التفاعل
- تمييز منطق الحدث من المزامنة
الحدث حد مقصود
مرر دالة إلى onClick ولا تستدعها أثناء العرض. يستدعيها التفاعل لاحقا فيفصل الوصف عن الفعل. سم المعالج بسلوكه ومرر ردود النداء إذا ملك الأب الحالة. يحتاج الزر اسما ونوعا داخل النموذج. لا تلغي React انتشار الأحداث والسلوك الافتراضي؛ تختلف stopPropagation عن preventDefault ولا تستخدمهما دون حاجة.
الحالة لقطة عرض
تعيد useState قيمة العرض ومحدثا يطلب عرضا آخر، ولا يعيد الاستدعاء كتابة المتغير المحفوظ في المعالج. لكل عرض لقطة، وقد تقرأ count القديمة بعد setCount. لا يصلح التأخير أو تعديل المحلي ذلك. ميز الحالة المطلوبة والواجهة التالية. يعاد إنشاء المتغير العادي ولا يوفر حالة مستمرة بين العروض.
طلب تحديث من التفاعل
يزيد المثال عدادا بزر أصلي. يحسب المحدث الدالي من السابق بالطابور دون الاعتماد على لقطة قديمة. يجب نقاؤه فلا ترسل طلبا أو تعدل كائنا داخله. يتغير العدد بعد الالتزام. اختبر النقر والنتيجة لا عدد العروض ولا تفترض أن المحدث يعيد وعدا ينتظر.
import { useState } from "react";
export default function App() { const [count, setCount] = useState(0); return <main><h1>Counter</h1><p>{count}</p><button type="button" onClick={() => setCount(c => c + 1)}>Add one</button></main>; }
Initial: 0. After one Add one click: 1.
يصطف تحديث نقي ويغير النقر العدد من صفر إلى واحد.
تركيب تحديثات الطابور
يصطف في المثال ثلاث زيادات دالية فيزداد العدد ثلاثا. أما ثلاث setCount(count + 1) فتحسب من اللقطة نفسها وتطلب الاستبدال نفسه. لا يغير التجميع دلالات الإغلاق. لا تقرأ حالة أخرى داخل المحدث لثابت متعدد الحقول؛ قد يوضح reducer أو كائن متماسك الانتقال.
import { useState } from "react";
export default function App() { const [count, setCount] = useState(0); function addThree() { setCount(c => c + 1); setCount(c => c + 1); setCount(c => c + 1); } return <main><h1>Queued updates</h1><p>{count}</p><button type="button" onClick={addThree}>Add three</button></main>; }
Initial: 0. After one Add three click: 3.
يستقبل كل محدث نتيجة السابق فتضيف النقرة ثلاثا.
تمييز منطق الحدث من المزامنة
إذا حدث الشراء بسبب نقر فضعه عند الحدث لا في Effect تراقب علما. تزامن Effects الأنظمة الخارجية ولها دورة مختلفة. وقد ينشئ الحدث عملا غير متزامن يحتاج ملكية وإلغاء وحماية. تبقى لقطة ما قبل await كما هي بعدها. اختبر التكرار والانتظار والفشل؛ فلا تضمن الحالة وحدها أثرًا بعيدا مرة واحدة.
الأخطاء الشائعة وإصلاحها
ينفذ الفعل أثناء العرض
- لماذا يحدث؟
- احتوت الخاصية نتيجة استدعاء.
- كيف تصلحه؟
- مرر الدالة أو غلافا.
- كيف تتجنب تكراره؟
- راجع خصائص الأحداث.
تضيف ثلاث تحديثات واحدا
- لماذا يحدث؟
- تستخدم اللقطة نفسها.
- كيف تصلحه؟
- استخدم الدوال عند الاعتماد على السابق.
- كيف تتجنب تكراره؟
- تتبع الطابور.
يعاد ضبط المتغير
- لماذا يحدث؟
- هو محلي عادي لا حالة.
- كيف تصلحه؟
- استخدم الحالة للمستمر المؤثر بالعرض.
- كيف تتجنب تكراره؟
- ميز الحالة من المشتق.
اختبر فهمك
1. توقع استدعاءين setCount(count + 1) عندما count خمسة.
اعرض الحل المشروح
يحسب كلاهما ستة ويطلبان الاستبدال لا الوصول لسبعة. تركب دالتان زيادتين إلى سبعة. الفرق الحساب المصطف لا سباق مؤقت.
2. أين يوضع حفظ مسودة يحدث عند نقر حفظ فقط؟
اعرض الحل المشروح
ضعه بالمعالج مع انتظار وفشل صريحين، لا Effect ترسل عند تغير علم أو حقل إلا إذا كانت المزامنة المستمرة المطلوبة. تبقى النية والملكية واضحتين.
أهم ما تعلمته
- تطلب المحدثات عرضا آخر.
- تحفظ المعالجات لقطات.
- تركب المحدثات الدالية تغييرات السابق.