微信小程序中wxml事件绑定传参

小程序中wxml事件绑定传参

在wxml中不能在bindtap中直接绑定事件时直接传入参数,html常见的操作例如:

<!--wxml-->
<view bindtap="selectNav(2)">2</view>

<!--js-->
selectNav: function(num){
    console.log(num)
}

会导致:VM27200:1 Component “pages/home/home” does not have a method “selectNav(2)” to handle event "tap"的错误,猜测是将selectNav(2)作为完整字符串去js文件中匹配相关的方法名,匹配失败后返回该报错。

既然不能直接传参,就只能通过属性传参,在bindtap事件触发后,返回的结果如下

changedTouches: [{…}]
currentTarget: {id: "", offsetLeft: 126, offsetTop: 1, dataset: {…}}
detail: {x: 203.8203125, y: 20.98828125}
mark: {}
mut: false
target: {id: "", offsetLeft: 126, offsetTop: 1, dataset: {…}}
timeStamp: 4322
touches: [{…}]
type: "tap"

在target和currentTarget均包含了相关的id和dataset属性。

关于target和currentTarget的区别:event.target指向引起触发事件的元素,而event.currentTarget则是事件绑定的元素,只有被点击的那个目标元素的event.target才会等于event.currentTarget。

所以这里使用currentTarget来绑定相关数据,而id只能绑定一个数据,显然不符合要求。

<!--wxml-->
<view class="nav-item iconfont iconfangjian {{navItem == 2 ? 'active': ''}}" bindtap="selectNav" data-num="2">

<!--js-->
selectNav: function ({ currentTarget }) {
    // console.log(res)
    this.setData({
        "navItem": currentTarget.dataset.num
    })
},

此时bindtap返回结果如下:

changedTouches: [{…}]
currentTarget:
    dataset: {num: "2"}
    id: ""
    offsetLeft: 126
    offsetTop: 1
    __proto__: Object
detail: {x: 174.96875, y: 19.390625}
mark: {}
mut: false
target: {id: "", offsetLeft: 126, offsetTop: 1, dataset: {…}}
timeStamp: 3516
touches: [{…}]
type: "tap"

在selectNav中通过解构赋值, currentTarget.dataset.num获取传递的参数num。

<think> 我们被要求回答关于微信小程序WXML中点击事件绑定的方法。根据提供的引用,特别是引用[3]、[4]和[5],我们可以总结出以下关键点: 1. 事件绑定使用`bind`或`catch`前缀,后面跟上事件类型(如`tap`表示点击事件)。例如:`bindtap`或`catchtap`。 2. 在WXML中绑定事件时,不能直接参数。如果需要在事件处理函数中参数,可以使用自定义属性(如`data-xxx`)来递,然后在事件对象中获取。 3. 事件处理函数需要在页面的JS文件中定义。 此外,引用[3]详细介绍了数据绑定和事件绑定的基本原则,引用[4]说明了不能直接事件绑定传参,引用[5]给出了一个事件处理函数的例子。 因此,回答的结构如下: 1. 介绍基本的事件绑定语法(bindtap/catchtap)。 2. 说明如何参数(通过data-*属性)。 3. 给出一个完整的示例,包括WXML和JS代码。 4. 解释事件对象中的参数获取。 同时,根据系统指令,我们需要使用正确的LaTeX格式(但本问题中没有数学表达式,所以不需要),使用中文,生成相关问题,并在引用的地方添加引用标识。 注意:引用标识应放在相关段落末尾,如[^3]等。 最后,生成相关问题。 </think> ### 微信小程序 WXML 点击事件绑定方法 在微信小程序开发中,WXML 的点击事件绑定主要通过以下步骤实现: 1. **基础绑定语法** 使用 `bindtap` 或 `catchtap` 指令绑定点击事件: ```html <view bindtap="handleTap">点击区域</view> ``` - `bindtap`:事件冒泡(子元素事件会向父元素递) - `catchtap`:阻止事件冒泡(仅触发当前元素事件)[^3][^5] 2. **事件处理函数定义** 在对应页面的 JS 文件中定义事件函数: ```javascript Page({ handleTap: function(e) { console.log("点击事件触发", e) } }) ``` 事件对象 `e` 包含 `target`(触发元素)和 `currentTarget`(绑定元素)等关键信息[^3][^5]。 3. **参数递方法** **WXML 不支持直接传参**(如 `bindtap="handleTap(123)"` 会报错),需通过 `data-*` 属性递: ```html <view bindtap="handleTap" data-id="123" data-type="test" >带参数点击</view> ``` ```javascript Page({ handleTap: function(e) { const id = e.currentTarget.dataset.id; // 获取 data-id const type = e.currentTarget.dataset.type; // 获取 data-type } }) ``` 通过 `e.currentTarget.dataset` 读取自定义参数[^3][^4]。 4. **阻止事件冒泡示例** ```html <view catchtap="handleTap"> <text>点击不会触发父元素事件</text> </view> ``` 使用 `catchtap` 替代 `bindtap` 可阻止事件向上层递[^5]。 5. **动态数据绑定结合** 可与数据绑定联动实现动态响应: ```html <view bindtap="changeText">{{message}}</view> ``` ```javascript Page({ data: { message: "点击修改文字" }, changeText: function() { this.setData({ message: "文字已更新!" }) } }) ``` 通过 `setData` 更新渲染层数据[^1][^2][^3]。 > **关键原则**: > - 事件名需与 JS 中函数名完全一致(如 `handleTap`) > - 参数必须通过 `data-*` 自定义属性递 > - 事件对象包含详细的元素信息和触摸点数据[^3][^5]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值