持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
什么是事件?
事件是从渲染层到逻辑层的通信方式,通过事件可以将用户在渲染层产生的行为,反馈到逻辑层进行业务处理。
举个栗子:
| 类型 | 绑定方式 | 事件描述 |
|---|---|---|
| tap | bindtap/bind:tap | 手指触摸后马上离开,类似于 HTML 中的 click 事件 |
| input | bindinput/bind:input | 文本框的输入事件 |
| change | bindchange/bind:change | 状态改变时触发 |
事件对象的属性列表
当事件回调触发时,会收到一个事件对象 event
举个栗子:
| 属性 | 类型 | 说明 |
|---|---|---|
| type | String | 事件类型 |
| timeStamp | Integer | 页面打开到触发事件所经过的毫秒数 |
| target | Object | 触发事件的组件的一些属性值集合 |
| currentTarget | Object | 当前组件的一些属性值集合 |
| detail | Object | 额外的信息 |
| touches | Array | 触摸事件,当前停留在屏幕中的触摸点信息的数组 |
| changedTouches | Array | 触摸事件,当前变化的触摸点信息的数组 |
target 和 currentTarget 的区别
target 是触发该事件的源头组件, currentTarget 是当前事件所绑定的组件。
举个栗子:
<view class="outer-view" bindtap="outer">
<view class="inner"></view>
</view>
点击内部的元素时,点击事件冒泡,也会触发外层 view 的 tap 事件处理函数
对于外层的 view 来说:
target 指向的是触发事件的源头组件,所以,e.target 是内部的按钮组件
currentTarget 指向的是当前正在触发事件的那个组件,所以,e.currentTarget 是当前的 view 组件
bindtap的语法格式
在小程序中,没有像 HTML 中的 onclick 鼠标点击事件,而是通过 tap 事件来响应用户的触摸行为。
1.通过 bindtap ,给组件绑定 tap 触摸事件
<button bindtap="skipDetail"></button>
2.在页面的 .js 文件中定义对应的事件处理函数,事件参数通过形参 event(一般简写成 e) 来接收
skipDetail(e){
console.log(e)
}
在事件处理函数中为data中的数据赋值
page({
data: {
count: 0
},
changeCount(){
this.setData({
count: this.data.count+1
})
}
})
事件传参
小程序中的事件传参和传统的html不同,不能在绑定事件的同时为事件处理函数传递参数 因为小程序会把 bindtap 的属性值,统一当作事件名称来处理
解决方法: 可以为组件提供 data-* 自定义属性传参,其中 * 代表的是参数的名字
举个栗子:
<button bindtap="skipDetail" data-info="{{2}}></button>
最终:
info 会被解析为 参数 的名字
数值 2 会被解析为 参数的值
在事件处理函数中,通过 event.target.dataset.参数名 即可获取到具体参数的值
skipDetail(e){
// dataset是一个对象,包含了通过data-传来的参数
console.log(e.target.dataset)
}
实现文本框和data之间的数据同步
实现步骤:
① 定义数据 ② 渲染结构 ③ 美化样式 ④ 绑定 input 事件处理函数
<input value="{{msg}}" bindinput="valueInput">
valueInput(e){
this.setData({
msg: e.detail.value
})
}