微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。

官方文档:

  • 事件冒泡处理不同
    • bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了bindtap点击事件,当点击子视图时,不仅子视图的点击事件处理函数会执行,其父视图中绑定的bindtap事件处理函数也会执行,前提是父视图也绑定了该事件。
    • catch:绑定的事件不会向上冒泡,触发当前组件的事件后,事件传播会停止。比如,在一个父子视图结构中,子视图使用catchtap绑定点击事件,当点击子视图时,只有子视图的点击事件处理函数会执行,父视图中绑定的bindtapcatchtap事件处理函数都不会执行。

有点类似于消息传递。

具体我们来测试感受一下:

先做三个按钮(wxml):

<view class="content" bind:tap="parentTap">
    <text bind:tap="childTap">bind测试</text>
  </view>
  <view class="content" bind:tap="parentTap">
    <text catch:tap="childTap">catch测试</text>
  </view>
  <view class="content" bind:tap="parentTap">
    <text>只有父窗口有响应</text>
  </view>

 然后在事件处理函数中打印一下log:

parentTap() {
    console.log("父组件点击");
  },
  childTap() {
    console.log("子组件点击");
  }

涉及的css布局:

.content{
  width: 300rpx;
  height: 80rpx;
  line-height: 80rpx;
  font-size: 28rpx;
  text-align: center;
  border: 1rpx solid #333;
  border-radius: 10rpx;
}

最后是这样的:

然后我们分别点击,看效果:

点击bind测试按钮,终端会打印2次:

说明什么,儿子有儿子的处理方法,老子有老子的处理方法。

点击catch测试按钮,终端会打印1次: 

说明什么:这点小事,我来处理就行了,不用告诉老子了。

点击最后一个按钮,终端打印:

 

说明什么,儿子惹的祸,他不管,老子还得管上。

小知识,知道就好,反正我到现在还没用到。 

<think> 我们正在讨论微信小程序中的事件绑定,特别是bind的用法。根据引用[1][2],我们可以知道: 1. 小程序中绑定事件使用bind方法,有两种方式:bind:事件名 或者 bind事件名(不带冒号)。 2. 常见的事件如tap(代替click)、input等。 3. 另外,还有catch绑定事件,它用于阻止事件冒泡。 用户的问题:我想了解微信小程序bind的用法。 因此,我们需要详细解释bind的用法,包括绑定的方式、事件类型、以及catch的区别。 根据引用[1][2]: - 第一种方式:bind:事件名,例如:bind:tap="handler" - 第二种方式:bind事件名(不写冒号),例如:bindtap="handler" 同时,引用[2][5]还提到了catch绑定,catch绑定的事件是非冒泡事件,即阻止事件向上冒泡。 所以,我们可以这样组织回答: 1. bind绑定事件的两种写法。 2. 常见事件类型(如tap、input等)。 3. bind绑定的事件是冒泡事件,即事件会向父节点传递。 4. 对比catch绑定,catch绑定的事件不会冒泡。 5. 举例说明。 另外,用户上一次的问题是关于map组件的,但当前问题转向了事件绑定,因此我们专注于事件绑定。 注意:引用[3][4]与当前问题无关,可以忽略。 下面开始回答: </think> ### 微信小程序中`bind`事件绑定详解 #### 一、核心用法 在小程序中,`bind`用于实现**事件绑定**,需注意: 1. **语法格式** - 标准写法:`bind:事件名="处理函数"`(带冒号) ```html <button bind:tap="handleTap">点击</button> ``` - 简写形式:`bind事件名="处理函数"`(省略冒号) ```html <button bindtap="handleTap">点击</button> ``` 两种写法等效,推荐简写形式[^1][^2]。 2. **事件类型** - `tap`:替代网页中的`click`事件(点击事件) - `input`:输入框内容变化时触发 - `longpress`:长按事件 完整事件列表见[官方文档](https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/event.html)。 3. **事件冒泡** `bind`绑定的事件会**向上层组件冒泡**。例如: ```html <!-- 点击按钮会同时触发btnHandlerparentHandler --> <view bind:tap="parentHandler"> <button bind:tap="btnHandler">按钮</button> </view> ``` 在`btnHandler`执行后,事件会传递到父元素触发`parentHandler`[^2][^5]。 #### 二、`bind`与`catch`的区别 | 绑定方式 | 冒泡行为 | 适用场景 | |----------|------------------|----------------------------| | `bind` | 允许事件向上冒泡 | 需要事件传递的场景 | | `catch` | 阻止事件冒泡 | 需隔离事件的组件(如弹窗) | ```html <!-- 点击按钮仅触发btnHandler,不触发parentHandler --> <view bind:tap="parentHandler"> <button catch:tap="btnHandler">隔离事件</button> </view> ``` `catch`通过阻止冒泡避免事件干扰[^2][^5]。 #### 三、事件对象参数 处理函数可通过默认参数`e`获取事件信息: ```javascript Page({ handleTap(e) { console.log(e.currentTarget.dataset.id) // 输出data-id的值 console.log(e.detail.x) // 点击位置的x坐标 } }) ``` 关键属性: - `currentTarget.dataset`:获取元素上`data-*`自定义属性 - `detail`:事件携带数据(如点击坐标、输入值等) #### 四、实战示例 ```html <input bindinput="handleInput" placeholder="输入实时触发" /> <view class="parent" bind:tap="parentTap"> <text bind:tap="childTap">允许冒泡</text> <text catch:tap="childTap">禁止冒泡</text> </view> ``` 对应逻辑层: ```javascript Page({ handleInput(e) { console.log("输入值:", e.detail.value) }, parentTap() { console.log("父元素被触发") }, childTap(e) { console.log("子元素被触发", e.currentTarget.dataset) } }) ``` > 总结: > - 优先用`bind事件名`简写绑定事件 > - 需要事件隔离时改用`catch` > - 通过`e.detail``e.currentTarget.dataset`获取事件数据[^1][^2][^5]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值