2.4.2
https://jsbin.com/qejofexedo/edit؟html ، js، output
انظر ارتباط الاستنساخ.
عندما أنقر على Expand is True
، ثم انقر على expand
ليصبح false
. وفقط countA
تغيرت.
عندما أنقر فوق Expand is Ture
، لم يحدث شيء.
تم تغيير countA
و countB
.
أعتقد أنه عند النقر ، تغير expand
إلى false
، لكن حدث النقر على الفور بدأ. يقوم بتنفيذ حدث نقر vnode آخر. ثم قم بالتوسيع إلى true
.
p
، section
، فلن تحدث أخطاء.i
tag إلى العلامة الأصل div
tag في div الأول ، فلن تحدث أخطاء
يبدو طبيعيا
يعمل repro الخاص بك على النحو المنشود ...
Kingwl @ yyx990803 آسف لذلك. اختبرت حالة الآخرين ونسيت العودة مرة أخرى.
الرمز المهم هو
<div class="header" v-if="expand"> // block 1
<i @click="expand = false, countA++">Expand is True</i> // element 1
</div>
<div class="expand" v-if="!expand" @click="expand = true, countB++"> // block 2
<i>Expand is False</i> // element 2
</div>
هناك أربع حالات:
block 1
و block2
، يعمل بشكل جيدelement 1
و element 2
، يعمل بشكل جيدblock 1
و element 2
، قم بتغيير expand
إلى true. لكن لا يمكن أن تتغير مرة أخرى.element 1
و block 2
، لا يمكن تغيير expand
إلى false. ولكن يمكن تغيير expand
إلى true.لذلك ، يحدث هذا بسبب:
<i>
، مما أدى إلى بدء التحديث الأول في nextTick (مهمة صغيرة)يعد هذا أمرًا صعبًا للغاية في الإصلاح ، كما أن بعض العناصر الأخرى التي تستفيد من المهام الدقيقة في قائمة انتظار التحديث تواجه هذه المشكلة أيضًا (على سبيل المثال ، قبل التشغيل). لا يبدو أن React لديها هذه المشكلة لأنها تستخدم نظام حدث اصطناعي (ربما بسبب حالات حافة كهذه).
للتغلب على هذه المشكلة ، يمكنك ببساطة إعطاء مفتاحي div الخارجيين مختلفين لإجبارهم على استبدالهم أثناء التحديثات. هذا من شأنه أن يمنع التقاط الحدث الفقاعي:
<div class="header" v-if="expand" key="1"> // block 1
<i @click="expand = false, countA++">Expand is True</i> // element 1
</div>
<div class="expand" v-if="!expand" @click="expand = true, countB++" key="2"> // block 2
<i>Expand is False</i> // element 2
</div>
التعليق الأكثر فائدة
لذلك ، يحدث هذا بسبب:
<i>
، مما أدى إلى بدء التحديث الأول في nextTick (مهمة صغيرة)يعد هذا أمرًا صعبًا للغاية في الإصلاح ، كما أن بعض العناصر الأخرى التي تستفيد من المهام الدقيقة في قائمة انتظار التحديث تواجه هذه المشكلة أيضًا (على سبيل المثال ، قبل التشغيل). لا يبدو أن React لديها هذه المشكلة لأنها تستخدم نظام حدث اصطناعي (ربما بسبب حالات حافة كهذه).
للتغلب على هذه المشكلة ، يمكنك ببساطة إعطاء مفتاحي div الخارجيين مختلفين لإجبارهم على استبدالهم أثناء التحديثات. هذا من شأنه أن يمنع التقاط الحدث الفقاعي: