React: هل يجب أن يؤدي تعيين الحالة داخل الأحداث المنفصلة إلى تشغيل التنظيف؟

تم إنشاؤها على ٥ مارس ٢٠١٩  ·  3تعليقات  ·  مصدر: facebook/react

هذا الخطأ محير للغاية:

https://twitter.com/kentcdodds/status/1102659818660102145

أعتقد أن هذا يحدث لأن fn المجدول بواسطة setInterval(fn, 0) يقفز أمام تنظيف التأثير [running] الناتج عن setRunning(false) . لذلك لا يزال الفاصل الزمني قيد التشغيل ، حيث تم استبدال setLapse(0) الذي حدث أثناء الحدث بـ setLapse(someValue) .

هذا يذكرني بالمشكلة الموضحة في https://github.com/facebook/react/issues/14750#issuecomment -460409609 ، أو على الأقل جزء منها:

في الواقع ، توجد هذه المشكلة حتى مع ضغطات مفاتيح React العادية (وغيرها من الأحداث "المنفصلة"). سيكون الحل لذلك هو مسح التأثيرات السلبية قبل أن نحصل على حدث منفصل.

ولكن هنا ، يبدو أن هذا لن يكون كافيًا لأن التأثير ينقلب كنتيجة للنقرة ، وليس قبلها. إذن ، هل يجب أن يتدفق التأثير السلبي أيضًا على setState داخل حدث منفصل؟ يبدو أنه لا. (هذا من شأنه أن يبطل الغرض من تأخيرهم).

إذن هذا يعمل حسب التصميم ، والإصلاح هو فقط useLayoutEffect عندما يكون التوقيت مهمًا؟ أو حل سلاح الجو الملكي البريطاني؟

Hooks Question

التعليق الأكثر فائدة

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

ومع ذلك ، كما هو الحال دائمًا ، يتم تصميم هذا بشكل أفضل كمخفض. يمكن للمخفض بسهولة رفض التحديثات عندما يعتقد أنه في حالة توقف وأيضًا تنفيذ المنطق لإعادة ضبطه بالفعل.

ال 3 كومينتر

المشكلة هي أن العداد نفسه ليس حدثًا منفصلاً. الأحداث المنفصلة مضمونة فقط فيما يتعلق بالأحداث المنفصلة الأخرى. لا أعتقد أن هذا ما تريده هنا.

يعد إيقاف المؤقت عملية غير متزامنة لأن جميع الحالات المحددة غير متزامنة. لذلك يمكن أن يأتي شيء آخر قبل أن يتم مسحه.

هذه هي الحالة التي لا يصلح فيها useLayoutEffect المشكلة بالكامل. بالتأكيد ليس في الوضع المتزامن ، ولكن هذا أيضًا سطحي في وضع المزامنة. إذا لم يكن جهاز ضبط الوقت ولكن دعنا نقول حدثًا بؤريًا ، فيمكن أن يتم إطلاق ذلك داخل دفعة قبل مسح هذا الأمر الذي سيكون له نفس المشكلة.

setRunning(false); // I would like to add a stop of this timer to the queue to be performed later
setLapse(0); // I would like to add an operation to set lapse to zero later
// lots of random stuff that can happen before the batch flushes
// This might also queue an operation to set lapse to something else
// actual rendering
// If concurrent mode, lots of other random stuff that can happen while rendering
// This might also queue an operation to set lapse to something else
// Actually do all that work in order

يتعلق الأمر كله بترتيب الأشياء المضافة إلى قائمة الانتظار.

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

ومع ذلك ، كما هو الحال دائمًا ، يتم تصميم هذا بشكل أفضل كمخفض. يمكن للمخفض بسهولة رفض التحديثات عندما يعتقد أنه في حالة توقف وأيضًا تنفيذ المنطق لإعادة ضبطه بالفعل.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات