在小程序开发中,事件是渲染层(Webview)到逻辑层(JsCore)的通讯方式。简单来说,当用户与小程序界面进行交互时(如点击按钮、滑动页面等),这些交互行为会被捕获并转化为特定的事件。这些事件随后被发送给逻辑层,逻辑层接收到事件后,会根据预定义的回调函数来处理这些事件,并执行相应的业务逻辑。
类型 | 绑定方式 | 事件描述 |
---|---|---|
tap | bindtap 或 bind:tap | 用户点击时触发,适用于按钮、图片等可点击元素 |
longtap | bindlongtap 或 bind:longtap | 用户长按时触发,适用于需要用户长时间按压的场景 |
touchstart | bindtouchstart 或 bind:touchstart | 手指触摸开始时触发 |
touchmove | bindtouchmove 或 bind:touchmove | 手指触摸后移动时触发 |
touchend | bindtouchend 或 bind:touchend | 手指触摸结束时触发 |
touchcancel | bindtouchcancel 或 bind:touchcancel | 手指触摸被打断(如来电)时触发 |
input | bindinput 或 bind:input | 文本框内容改变时触发,常用于获取用户输入的内容 |
change | bindchange 或 bind:change | 组件状态改变时触发,如单选框、复选框、滑动条等组件的值改变 |
submit | bindsubmit 或 bind:submit | 表单提交时触发,常用于收集用户输入的数据 |
reset | bindreset 或 bind:reset | 表单重置时触发,常用于清空表单中的数据 |
confirm | bindconfirm 或 bind:confirm | 弹出框(如模态框)确认按钮被点击时触发 |
cancel | bindcancel 或 bind:cancel | 弹出框(如模态框)取消按钮被点击时触发 |
scroll | bindscroll 或 bind:scroll | 页面或组件滚动时触发,常用于实现滚动监听 |
swipe | bindswipe 或 bind:swipe | 用户快速滑动时触发,常用于实现轮播图等滑动效果 |
当事件回调触发的时候,会收到一个事件对象 event,它的详细属性如下
属性名 | 数据类型 | 说明 |
---|---|---|
type | string | 事件类型 |
timeStamp | number | 触发事件的时间戳 |
target | object | 触发事件的源头组件 |
currentTarget | object | 当前绑定事件处理函数的组件 |
detail | object | 事件的附加数据,根据具体事件类型不同而不同 |
touches | array | 触摸事件时,当前触摸点列表 |
changedTouches | array | 触摸事件时,发生变化的触摸点列表 |
targetTouches | array | 触摸事件时,目标元素上的触摸点列表 |
其中target
和detail
是比较常用的
target 是触发该事件的源头组件,而 currentTarget 则是当前事件所绑定的组件。 首先设置了一个view组件,然后在view组件中嵌套了一个button组件,通过bindtap给view组件绑定了一个outerHandler(手指触摸事件)
点击内部的按钮时,点击事件以冒泡的方式向外扩散,也会触发外层 view 的 tap 事件处理函数。(也就是说当点击按钮的时候,首先触发按钮的事件,然后会进行扩散,触发view
组件的事件)
此时,对于外层的 view 来说:
在小程序中,不存在 HTML 中的 onclick 鼠标点击事件,而是通过 tap 事件来响应用户的触摸行为。
通过 bindtap,可以为组件绑定 tap 触摸事件,语法如下:
index.wxml文件
<button type="primary" bindtap="btnTapHandler">按钮</button>
在页面的 .js 文件中定义对应的事件处理函数,事件参数通过形参 event(一般简写成 e) 来接收:
index.js文件
Page({
btnTapHandler(e){
console.log(e)
}
})
然后再页面上点击按钮,查看Console中捕捉到的事件
捕捉到的事件:
通过调用 this.setData(dataObject) 方法,可以给页面 data 中的数据重新赋值,示例如下:
index.wxml文件:
<button type="primary" bindtap="changeC">加1</button>
<view class="container">
<!-- 动态绑定文本 -->
<text>当前用户名:{{count}}</text>
</view>
<button>
): <view>
) 和文本 (<text>
): <view class="container">
:定义了一个类名为 container 的视图容器,用于包裹内部的文本元素。<text>
当前用户名:{{count}}</text>
:这里使用了数据绑定({{count}}),它会显示 index.js 文件中 data 对象中 count 属性的值。index.js文件:
Page({
data:{
count:0
},
changeC(){
this.setData({
count:this.data.count+1
})
}
})
在小程序(如微信小程序)的开发中,this.setData({}) 是一个非常重要的方法,它用于更新页面数据并触发页面的重新渲染。
当你调用 this.setData(object) 时,你实际上是在告诉小程序框架:“我想更新这些数据,并且希望页面能够反映出这些变化。
this.data.count表示获取到当前页面上count的值
下面结果图中注意页面上的数字变化,和右下角中的AppData中count的变化
小程序中的事件传参比较特殊,不能在绑定事件的同时为事件处理函数传递参数。例如,下面的代码将不能正常工作
<button type="primary" bindtap="btnHandler(666)">事件传参</button>
定义了一个按钮,在按钮中定义了一个点击事件,事件中直接给btnHandler加上括号里面加入了666这个参数,这样是不可以的!小程序会把btnHandler(666)当做事件的名称,不会把括号里面的当成参数
可以为组件提供 data-* 自定义属性传参,其中 * 代表的是参数的名字,示例代码如下:
<button type="primary" bindtap="btnHandler" data-age="{{2}}">事件传参</button>
定义了一个按钮(button),设置了一个点击事件,名称为btnHandler,然后定义了一个参数,参数的名称是age,值是2,设置参数的时候使用的是Mustache 语法的格式{{}},如果不使用Mustache 语法的格式那么参数就是字符串的格式,使用了在里面写一个2,那么就是数字格式
在事件处理函数中,通过 event.target.dataset.参数名 即可获取到具体参数的值,示例代码如下:
index.wxml文件
<button type="primary" bindtap="user_age" data-age="{{2}}">查看年龄</button>
index.js文件
Page({
user_age(event){
console.log("获取所有参数:",event.target.dataset)
console.log("当前用户的年龄是:",event.target.dataset.age)
}
})
在小程序中,通过 input 事件来响应文本框的输入事件
index.wxml文件 定义一个bindinput,绑定文本框的输入事件,名称为input_username
<input bindinput="input_username"></input>
index.js文件
Page({
input_username(e){
// e.detail.value 每次都会获取文本框中最新的值
console.log(e.detail.value)
}
})
我先输入一个张,然后输入一个三,然后再输入一个李,然后再输入一个四,可以看到,每次都是获取到最新的输入内容
在小程序页面的data对象中,我们需要定义一个属性来存储文本框中的值。这个属性可以是任意名称,但最好能够反映其用途,比如inputValue。
Page({
data: {
inputValue: '' // 初始化为空字符串
}
})
在WXML文件中,我们使用<input>
标签来创建一个文本框,并通过value属性绑定到data对象中的inputValue属性。同时,我们需要为<input>
标签添加一个bindinput事件监听器,用于捕获用户的输入事件。
<input type="text" value="{{inputValue}}" bindinput="handleInputChange" />
这里,{{inputValue}}是WXML模板语法中的插值表达式,用于将data对象中的inputValue属性值渲染到文本框中。bindinput="handleInputChange"表示当文本框的内容发生变化时,会调用handleInputChange方法来处理这个事件。
虽然这一步不是实现数据同步所必需的,但为了使文本框更加美观,我们可以在WXSS文件中为其添加一些样式。例如,可以设置文本框的宽度、高度、边框、内边距等属性。
input {
width: 100%;
height: 40px;
border: 1px solid #ccc;
padding: 5px;
box-sizing: border-box;
}
在页面的JavaScript文件中,我们需要定义一个名为handleInputChange的方法来处理bindinput事件。这个方法会接收一个事件对象作为参数,我们可以通过这个对象的detail.value属性来获取文本框中的当前值。然后,我们使用this.setData方法来更新data对象中的inputValue属性。
Page({
data: {
inputValue: ''
},
handleInputChange: function(e) {
this.setData({
inputValue: e.detail.value
});
}
})
在这里,this.setData是一个非常重要的方法,它用于更新页面的数据并触发页面的重新渲染。当我们调用this.setData时,小程序框架会比较新旧数据之间的差异,并只更新那些发生变化的部分,从而提高页面的渲染效率。
注意看AppData中的内容,变量的值会随着我们的输入实时变化
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有