微信小程序bind:tap与bindtap与catch:tap区别

在微信小程序中,bind:tapbindtapcatch:tap 都是绑定点击事件的方式,它们的主要区别在于事件冒泡和命名方式


1️⃣ bindtapbind:tap

作用:两者是等价的,都是绑定事件,并且允许事件冒泡
区别

  • bindtap简写 形式,推荐使用。
  • bind:tap完整写法,但较少使用。

示例

<view bindtap="handleTap">点击我</view>
<!-- 等价于 -->
<view bind:tap="handleTap">点击我</view>
Page({
  handleTap() {
    console.log("点击事件触发");
  }
});

2️⃣ catch:tap

🚫 作用catch:tap 绑定事件但阻止事件冒泡,即不会向父级元素传递事件。

示例

<view bindtap="parentTap" style="background: lightgray; padding: 20px;">
  <view catch:tap="childTap" style="background: white; padding: 10px;">点击我</view>
</view>
Page({
  parentTap() {
    console.log("父级元素被点击");
  },
  childTap() {
    console.log("子级元素被点击");
  }
});

点击结果

点击对象 控制台输出
点击子元素 (<view catch:tap="childTap">) 子级元素被点击(父级不会触发)
点击父元素 (<view bindtap="parentTap">) 父级元素被点击

🔹 catch:tap 阻止了事件冒泡,所以点击子元素时不会触发父元素的 bindtap


3️⃣ 总结

绑定方式 是否允许事件冒泡 适用场景
bindtap / bind:tap ✅ 允许 默认使用,点击子元素会触发父元素的 bindtap
catch:tap ❌ 阻止 阻止事件冒泡,点击子元素时不触发父元素事件

👉 什么时候用 catch:tap

  • 例如,在 modal(弹窗)中,点击 背景 关闭弹窗,但点击 内容区 不关闭:
<view bindtap="closeModal" class="modal-background">
  <view catch:tap="stopPropagation" class="modal-content">
    这里是弹窗内容
  </view>
</view>
Page({
  closeModal() {
    console.log("关闭弹窗");
  },
  stopPropagation() {
    console.log("点击内容区,不触发关闭");
  }
});

🚀 这样点击弹窗内容不会关闭,但点击背景会触发 closeModal 关闭弹窗! 🎯

posted @ 2025-03-12 15:04  saulstavo  阅读(249)  评论(0)    收藏  举报