使用.stop解决事件冒泡问题

原代码为

<van-radio
  v-for="dict in item.dicData"
  :key="dict.value"
  :name="dict.value"
  :disabled="isCompReadOnly"
  class="option"
>
  <span class="label">{{ dict.label }}</span>
  <van-icon
    name="question-o"
    size="18"
    class="question"
    v-if="dict.optionTips && dict.optionTips !== ''"
    @click="openTip(dict.optionTips)"
  />
</van-radio>

但是点击icon时单选框也被默认选中了,是不符合需求的。

解决方法:增加.stop

<van-icon
  name="question-o"
  size="18"
  class="question"
  v-if="dict.optionTips && dict.optionTips !== ''"
  @click.stop="openTip(dict.optionTips)"
/>

问题核心是点击图标时事件冒泡到了父级单选框,导致单选框被选中。

.stop 修饰符会阻止事件冒泡,从根源上避免父元素(单选框)接收到点击事件,因此更适合解决这个问题。

.prevent 的主要作用是阻止浏览器默认行为(如表单提交、链接跳转等),而单选框的选中行为是组件内部逻辑,并非浏览器默认行为,因此 .prevent 通常无法阻止单选框被选中。

某些情况下,组件可能对事件处理做了特殊处理,此时可以同时使用 .stop 和 .prevent。

 

posted @ 2025-08-23 10:51  罗毅豪  阅读(8)  评论(0)    收藏  举报