小程序-基础篇-WXML模板语法-事件绑定

335 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

什么是事件?

事件是从渲染层到逻辑层的通信方式,通过事件可以将用户在渲染层产生的行为,反馈到逻辑层进行业务处理。

举个栗子:

类型绑定方式事件描述
tapbindtap/bind:tap手指触摸后马上离开,类似于 HTML 中的 click 事件
inputbindinput/bind:input文本框的输入事件
changebindchange/bind:change状态改变时触发

事件对象的属性列表

当事件回调触发时,会收到一个事件对象 event

举个栗子:

属性类型说明
typeString事件类型
timeStampInteger页面打开到触发事件所经过的毫秒数
targetObject触发事件的组件的一些属性值集合
currentTargetObject当前组件的一些属性值集合
detailObject额外的信息
touchesArray触摸事件,当前停留在屏幕中的触摸点信息的数组
changedTouchesArray触摸事件,当前变化的触摸点信息的数组

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
    })
}