小程序从入门到入坑:事件系统
前言
哈喽大家好,我是 SuperYing,本文是小程序从入门到入坑系列的第 3 篇,将比较详尽的讲解 小程序事件系统 的相关知识点,欢迎小伙伴阅读。
读完本文您将收获:
- 了解小程序事件及基础使用。
- 了解小程序事件分类及多种的绑定方式。
- 了解如何使用
wxs绑定事件响应函数。
什么是事件
借用官网的描述:
- 事件是视图层到逻辑层的通讯方式。
- 事件可以将用户的行为反馈到逻辑层进行处理。
- 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
- 事件对象可以携带额外信息,如
id,dataset,touches。
事件 可以完成从 视图层 到 逻辑层 的通信,通过特定的参数处理方式,实现对于用户行为的逻辑处理。
事件绑定
事件分类
小程序事件分为:
- 冒泡事件:当一个组件上的事件被触发后,该事件会向父节点传递。
- 非冒泡事件:当一个组件上的事件被触发后,该事件不会向父节点传递。
WXML 的冒泡事件列表:
| 类型 | 触发条件 | 最低版本 |
|---|---|---|
| touchstart | 手指触摸动作开始 | |
| touchmove | 手指触摸后移动 | |
| touchcancel | 手指触摸动作被打断,如来电提醒,弹窗 | |
| touchend | 手指触摸动作结束 | |
| tap | 手指触摸后马上离开 | |
| longpress | 手指触摸后,超过350ms再离开,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发 | 1.5.0 |
| longtap | 手指触摸后,超过350ms再离开(推荐使用longpress事件代替) | |
| transitionend | 会在 WXSS transition 或 wx.createAnimation 动画结束后触发 | |
| animationstart | 会在一个 WXSS animation 动画开始时触发 | |
| animationiteration | 会在一个 WXSS animation 一次迭代结束时触发 | |
| animationend | 会在一个 WXSS animation 动画完成时触发 | |
| touchforcechange | 在支持 3D Touch 的 iPhone 设备,重按时会触发 | 1.9.90 |
注:除上表之外的其他组件自定义事件如无特殊声明都是非冒泡事件,如 form 的
submit事件,input 的input事件,scroll-view 的scroll事件,(详见各个组件)
普通事件绑定
事件绑定的写法类似于组件的属性,在 bind:(冒号 : 可省略) 后面加上事件名称:
bind:[事件名称]="[事件绑定函数名称]"
事件绑定函数名称 是一个字符串,指向在 .ts/.js 文件的 Page 函数中定义的处理函数名。
eg:
<view bind:tap="handleTap">点击区域</view>
事件绑定函数名称也可以是数据绑定,但是绑定的变量必须是一个字符串,指向事件处理函数名。若该变量为空字符串,则绑定会失效,可以该特性来暂时禁用某些事件。
<view bind:tap="{{ tapHandlerName }}">点击区域</view>
Page({data: {tapHandlerName: 'handleTap'},handleTap() {// tap 事件处理逻辑...}
})
阻止事件冒泡绑定
除了使用 bind 绑定事件,还可以使用 catch 绑定。两者区别在于 catch 会事件向上冒泡。
在 「事件分类」part 我们知道,小程序事件有一种冒泡事件,此类事件触发后会向父节点传递。
eg:
<view id="outer" bind:tap="handleTap1">outer view<view id="middle" catch:tap="handleTap2">middle view<view id="inner" bind:tap="handleTap3">inner view</view></view>
</view>
上例中,点击 inner view 会先后调用 handleTap3 和 handleTap2,这是因为 tap 事件会冒泡到 middle view,而 middle view 阻止了 tap 事件冒泡,不再向父节点传递.点击 middle view 会触发 handleTap2,点击 outer view 会触发 handleTap1。
互斥事件绑定
除了 bind 和 catch 外,还可以使用 mut-bind 来绑定互斥事件,所有 mut-bind 绑定都是互斥的,只会触发其中一个绑定函数,但是不会影响bind 和 catch 绑定的事件。
也就是说,触发 mut-bind 绑定的事件后,如果事件冒泡到父级节点上,在父级节点上使用 mut-bind 绑定的事件不会被触发,而使用 bind 和 catch 绑定的事件可以正常触发。
eg:
<view id="outer" mut-bind:tap="handleTap1">outer view<view id="middle" bindtap="handleTap2">middle view<view id="inner" mut-bind:tap="handleTap3">inner view</view></view>
</view>
上例中,点击 inner view 会先后调用 handleTap3 和 handleTap2,因为 handleTap3 和 handleTap1 绑定的事件互斥,所以冒泡到 outer 时不会触发 handleTap1。点击 middle view 会调用 handleTap2 和 handleTap1。
事件捕获阶段绑定
小程序的触摸类事件支持捕获阶段。捕获阶段发生在冒泡事件之前,事件到达节点的顺序与冒泡阶段恰好相反。
对于 DOM 事件比较了解的小伙伴应该比较清楚,支持捕获阶段的事件触发流程如下:
可以通过 capture-bind 和 capture-catch 来在捕获阶段绑定事件,其中 capture-catch 会中断捕获阶段并取消冒泡阶段。
<view id="outer" bind:touchstart="handleTap1" capture-bind:touchstart="handleTap2">outer view<view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">inner view</view>
</view>
上例中,点击 inner view 会先后调用 handleTap2、handleTap4、handleTap3、handleTap1。
若将上例中的 capture-bind:touchstart="handleTap2" 改为 capture-catch:touchstart="handleTap2",将会仅触发 handleTap2。
eg:
<view id="outer" bind:touchstart="handleTap1" capture-catch:touchstart="handleTap2">outer view<view id="inner" bind:touchstart="handleTap3" capture-bind:touchstart="handleTap4">inner view</view>
</view>
wxs 绑定响应函数
在上一篇 框架语法 中我们有提到小程序的脚本语言 wxs。我们可以在 wxs 中创建事件处理参数,绑定到指定事件上(注意:仅能响应内置组件的事件,不支持自定义事件)。
使用 wxs 绑定响应函数,主要是用来优化频繁交互的场景,将事件响应放到视图层,避免视图层与逻辑层频繁通信,导致交互过程的延迟。
wxs 的事件处理函数包括两个参数:
- event: 事件对象,在 小程序事件对象 的基础上,多了一个
instance属性,用来表示触发事件结构的ComponentDescriptor实例。 - ownerInstance: 触发事件的组件所在的组件的
ComponentDescriptor实例,如果触发事件的组件在页面内,ownerInstance表示的是页面实例。
ComponentDescriptor是小程序内部封装的类,包括selectComponent,selectAllComponents,setStyle,addClass/removeClass/hasClass,callMethod等实例方法,可用于获取页面组件实例,设置组件样式,与逻辑层交互等功能。
eg:
// index.wxml
<wxs module="tools" src="./tools.wxs"></wxs>
<view id="tapTest" data-hi="微信小程序" bindtap="{{tools.tapName}}"> Click me! </view>
// tools.wxs
function tapName(event, ownerInstance) {console.log('tap 事件', JSON.stringify(event))
}
module.exports = {tapName: tapName
}
结语
好啦,今天我们整体性的讲述了 小程序事件系统 相关的内容。相信读到这里的小伙伴已经对 小程序事件系统 有了比较清晰的了解,爱动手的小伙伴们快去动起来吧😁。
若有疑问,欢迎评论区。感谢阅读!愿你我共同进步,谢谢!!!
相关文章:
小程序从入门到入坑:事件系统
前言 哈喽大家好,我是 SuperYing,本文是小程序从入门到入坑系列的第 3 篇,将比较详尽的讲解 小程序事件系统 的相关知识点,欢迎小伙伴阅读。 读完本文您将收获: 了解小程序事件及基础使用。了解小程序事件分类及多种的…...
Windows蓝牙驱动开发之模拟HID设备(二)(把Windows电脑模拟成蓝牙鼠标和蓝牙键盘等设备)
by fanxiushu 2024-03-24 转载或引用请注明原作者 接上文,当我们建立了蓝牙链接请求之后,就该传输数据了, 其实传输数据比起上章阐述的创建SDP和建立连接要简单许多。 使用类型 BRB_L2CA_ACL_TRANSFER 的BRB请求,就可以实现接收和发送操作, 至于具体是接收还是发送,根据设…...
快速区分清楚图形渲染中的AABB,KD树和BVH这些概念
快速区分清楚图形渲染中的AABB,KD树和BVH这些概念 主要想形象去区分好这些术语,目的是扫盲,先开好坑,内容持续填充。 0.先摆出这些词的全称 AABB: 原名:axis aligned bounding box;中文直译名…...
Rust 的 HashMap 特定键值元素值的累加方法
在Rust中,如果你想要对HashMap中特定键对应的值进行累加操作,你需要首先检查该键是否已存在。如果存在,则取出其值,进行累加,然后将结果存回HashMap。如果不存在,则可能需要插入一个新的键值对,…...
Java后端项目性能优化实战-群发通知
背景 公司群发通知模块性能存在问题,我进行全面的系统调优,系统处理能力大幅提升。 原发送流程 优化后的发送流程 优化的点 说明:以下问题基本都是压测过程遇到的,有些问题普通的功能测试暴露不了。优化目标:保证高…...
5、Jenkins持续集成-Maven和Tomcat的安装与配置
文章目录 一、Maven的安装与配置1、安装maven并配置环境2、全局工具配置关联jdk和maven3、添加Jenkins全局变量4、修改settings.xml文件5、测试是否配置成功二、Tomcat的安装与配置1、安装tomcat8+2、配置Tomcat用户角色权限3、测试是否配置成功一、Maven的安装与配置 在Jenki…...
Qt教程 — 3.7 深入了解Qt 控件: Layouts部件
目录 2 如何使用Layouts部件 2.1 QBoxLayout组件-垂直或水平布局 2.2 QGridLayout组件-网格布局 2.3 QFormLayout组件-表单布局 在Qt中,布局管理器(Layouts)是用来管理窗口中控件位置和大小的重要工具。布局管理器可以确保窗口中的控件在…...
自动驾驶的几种名词
1. 自适应巡航控制(ACC) 自适应巡航控制(Adaptive Cruise Control,ACC)是一种汽车驾驶辅助系统,它可以根据前方车辆的速度和距离自动调整车辆的速度,以保持与前车的安全距离。ACC系统由控制层和…...
华为全套企业管理资料合集(21专题)
华为全套企业管理资料合集-知识星球下载 1.绩效考核 华为内训绝密资料:绩效管理与绩效考核.ppt 华为绩效管理与绩效考核制度.docx 华为公司实用性各种绩效图表汇总.doc 华为公司考勤管理制度.doc 华为IPD模式中跨部门团队成员的考核激励制度.doc 2.企业管理 华为公司人力资源…...
LeetCode Python - 74. 搜索二维矩阵
目录 题目描述解法方法一:二分查找方法二:从左下角或右上角搜索 运行结果方法一方法二 题目描述 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给…...
如何安全地添加液氮到液氮罐中
液氮是一种极低温的液体,它在许多领域广泛应用,但在处理液氮时需谨慎小心。添加液氮到液氮罐中是一个常见的操作,需要遵循一些安全准则以确保操作人员的安全和设备的完整性。 选择合适的液氮容器 选用专业设计用于存储液氮的容器至关重要。…...
LGBM算法 原理
简介 GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛,通常被…...
【WPF应用5】WPF中的TextBlock控件:属性与事件详解及示例
在WPF(Windows Presentation Foundation)开发中,TextBlock控件是一个常用的元素,用于显示静态或动态文本内容。它提供了丰富的属性和事件,使得开发者能够灵活地控制文本的显示样式和响应用户的交互行为。本文将详细介绍…...
【C语言基础】:内存操作函数
文章目录 一、memcpy函数的使用和模拟实现1.1 memcpy函数的使用1.2 memcpy函数的模拟实现 二、memmove函数的使用和模拟实现2.1 memmove函数的使用2.2 memmove函数的模拟实现 三、memset函数的使用3.1 menset函数的使用 四、memcmp函数的使用4.1 memcmp函数的使用 学海无涯苦作…...
3.24作业
基于UDP的网络聊天室 项目需求: 如果有用户登录,其他用户可以收到这个人的登录信息如果有人发送信息,其他用户可以收到这个人的群聊信息如果有人下线,其他用户可以收到这个人的下线信息服务器可以发送系统信息 服务器端代码 #in…...
Excel双击单元格后弹窗输入日期
Step1. 在VBE界面新建一个窗体(Userform1),在窗体的工具箱的空白处右键,选中添加附件,勾选Calendar control 8.0,即可完成日历的添加。 PS:遗憾的是, Office 64 位没有官方的日期选择器控件。唯一的解决方案是使用Excel 的第三方日历。 参考链接:How to insert calen…...
原生 HTML/CSS/JS 实现右键菜单和二级菜单
文章来源:www.huhailong.vip 站点 文章源地址:https://www.huhailong.vip/article/1764653112011841538 Demo效果演示地址 先看效果图 {{{width“auto” height“auto”}}} 需要注意的就是边界检测处理,到极端点击底部和右侧时如果不做处理会…...
[项目前置]如何用webbench进行压力测试
测试软件 采用webbench进行服务器性能测试。 Webbench是知名的网站压力测试工具,它是由Lionbridge公司开发。 webbench的标准测试可以向我们展示服务器的两项内容: 每秒钟相应请求数 和 每秒钟传输数据量 webbench测试原理是,创建指定数…...
网络七层模型:理解网络通信的架构(〇)
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
format(C++20)
1. std::format format_01.cpp // g format_01.cpp -stdc20 #include <iostream> #include <string> #include <format>void test_01() {// 使用字符串填充std::cout << std::format("Hello {}!\n", "World"); // Hello World!…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...
