前端【小程序】10-小程序基础篇【事件对象】【组件事件【scroll-view】、【form表单快速收集表单数据】】
事件处理
事件对象
前面已经介绍过小程序事件监听的语法:bind:事件类型=事件回调
,但是小程序的事件回调不支持传参数,因此要将模板中的数据传递到事件回调中就必须要通过事件对象来实现。
小程序事件回调函数的第 1 个参数即为事件对象,事件对象中包括了一些有用的信息:
index.wxml
1 <!-- 搜索框 --> 2 <view class="search-bar"> 3 <input type="text" placeholder="输入搜索关键字" /> 4 </view> 5 <!-- 页面主体 --> 6 <view class="page-body"> 7 <scroll-view scroll-y class="aside"> 8 <!-- 通过bind:tap="onChangeTab"绑定事件, 事件名称为onChangeTab, 通过自定义属性传参,然后js中通过事件对象e.target拿对应的值 --> 9 <!-- <view class="item" bind:tap="onChangeTab" data-index="{{ 0 }}"></view> --> 10 11 <!-- 通过 mark:index="{{ 0 }}" 传参,然后js中的方法通过第一个参数事件对象e.mark.index 拿到传的这个0--> 12 <!-- <view class="item" bind:tap="onChangeTab" mark:index="{{ 0 }}"></view> --> 13 14 <view class="item {{activeIndex === item ? 'active' : ''}}" // 如果activeIndex与当前item的下标一致,就添加active类名,让其高亮显示 16 bind:tap="onChangeTab" 17 mark:index="{{ index }}" 18 wx:for="{{ 4 }}" 19 wx:key="*this" 20 > 21 {{ item }} 22 </view> 23 </scroll-view> 24 <scroll-view scroll-y class="content"> 25 <view class="item" wx:for="{{10}}" wx:key="*this" bind:scrolltolower="onScrolltolower"></view> 26 </scroll-view> 27 </view>
index.wxss
1 /* pages/events/index.wxss */ 2 page { 3 padding: 0; 4 } 5 6 .search-bar { 7 padding: 20rpx 30rpx; 8 background-color:#fff; 9 } 10 11 .search-bar input { 12 padding-left: 40rpx; 13 border: 1rpx solid #eee; 14 border-radius: 70rpx; 15 font-size: 28rpx; 16 color: #333; 17 } 18 19 .page-body { 20 height: 420rpx; 21 display: flex; 22 margin-top: 20rpx; 23 } 24 25 .page-body .aside { 26 width: 200rpx; 27 padding: 20rpx; 28 background-color: #fff; 29 } 30 31 .page-body .aside .item { 32 height: 60rpx; 33 margin-bottom: 20rpx; 34 border-radius: 10rpx; 35 background-color: #eee 36 } 37 38 .page-body .aside .active { 39 background-color: pink; 40 } 41 42 .page-body .content { 43 flex: 1; 44 padding: 20rpx; 45 margin-left: 20rpx; 46 background-color: #fff; 47 } 48 49 .page-body .content .item { 50 float: left; 51 width: 215rpx; 52 height: 215rpx; 53 margin: 0 20rpx 20rpx 0; 54 border-radius: 10rpx; 55 background-color: #eee; 56 } 57 58 .page-body .content .item:nth-child(even) { 59 margin-right: 0; 60 } 61 62 .register { 63 margin-top: 20rpx; 64 } 65 66 .register .form-field { 67 display: flex; 68 padding: 0 40rpx; 69 height: 88rpx; 70 line-height: 88rpx; 71 background-color: #fff; 72 color: #333; 73 } 74 75 .register .form-field label { 76 width: 120rpx; 77 } 78 79 .register .form-field .field { 80 flex: 1; 81 } 82 83 .register .form-field input { 84 height: 60rpx; 85 border: none; 86 } 87 88 .register button { 89 display: block; 90 height: 72rpx; 91 line-height: 72rpx; 92 margin: 20rpx 40rpx 0; 93 }
index.js
1 Page({ 2 data:{ 3 activeIndex:0 4 }, 5 onScrolltolower(){ 6 console.log('滚动触底了'); 7 }, 8 onChangeTab(e) { 9 // console.log(e.target.dataset.index); // data-index 传参的时候,获取自定义参数的方式 11 // console.log(e.mark.index); // mark:index 传参的时候,获取自定义参数的方式 12 const { index } = e.mark 13 console.log(index); 14 // 保存当前点击的下标,用于高亮 15 this.setData({ 16 activeIndex:index 17 }) 18 } 19 })
组件事件
前面介绍的 tap
事件可以在绝大部分组件是监听,我们可以将其理解为通用事件类型,然而也有事件类型只属于某个组件,我们将其称为组件事件。
scroll-view
组件中的事件
bind:scrolltolower
当滚动内容到达底部或最右侧时触发refresher-enable
启用自定义下拉刷新bind:refresherrefresh
执行下拉操作时触发
1 <view class="page-body"> 2 <scroll-view 3 scroll-y // 允许Y轴滚动 4 class="content" 5 refresher-enabled // 允许下拉 6 bind:refresherrefresh="onRefresherrefresh" // 绑定下拉刷新的时候触发事件,onRefresherrefresh 7 refresher-triggered="{{ isTriggered }}" // 触发下拉,根据变量isTriggered 8 bind:scrolltolower="onScrolltolower" // 绑定触底或者触右时触发的事件 9 > 10 <view class="item" wx:for="{{10}}" wx:key="*this"></view> 11 </scroll-view> 12 </view>
1 Page({ 2 data: { 3 isTriggered: false 4 }, 5 onRefresherrefresh () { 6 console.log('下拉时触发') 7 // 设置下拉状态为true 8 this.setData({ 9 isTriggered: true 10 }) 11 12 // 延迟1秒关闭下拉状态 13 setTimeout(() => { 14 this.setData({ 15 isTriggered: false 16 }) 17 }, 1000) 18 }, 19 20 onScrolltolower () { 21 console.log('滚动触底了') 22 } 23 })
表单组件中的事件
文档:https://developers.weixin.qq.com/miniprogram/dev/component/form.html当点击 form 表单中 form-type 为 submit 的 button 组件时,会将表单组件中的 value 值进行提交,需要在表单组件中加上 name 来作为 key。
change
表单数据发生改变时触发,事件对象中收集数据input
和textarea
用双向绑定,底层通过bind:input
和value
实现submit
表单提交时触发,button
按钮必须指定form-type
属性
1 <!-- 用户信息 --> 2 <view class="register"> 3 <form bind:submit="onSubmit"> // 1、表单绑定onSubmit事件 4 <view class="form-field"> 5 <label for="">姓名:</label> 6 <view class="field"> 7 <input name="username" type="text" placeholder="请输入您的姓名" /> // 2、给表单组件添加name属性,用于表单收集时的key 8 </view> 9 </view> 10 // 3、button必须添加form-type属性, 点击保存按钮的时候,触发表单的onSubmit事件,通过e.detail.value 拿到整个表单的数据 11 <button form-type="submit" size="mini" type="primary">保存</button> 12 </form> 13 </view>
1 Page({ 2 onSubmit (e) { 3 console.log(e.detail) 4 console.log(e.detail.value) // 表单中所有有name属性的表单数据 5 } 6 })
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具