HarmonyOS NEXT应用开发案例——阻塞事件冒泡
介绍
本示例主要介绍在点击事件中,子组件enabled属性设置为false的时候,如何解决点击子组件模块区域会触发父组件的点击事件问题;以及触摸事件中当子组件触发触摸事件的时候,父组件如果设置触摸事件的话,如何解决父组件也会被触发的问题。
效果图预览

使用说明:
- 开启使能开关,在点击事件场景下,点击子组件,不能触发本身和父组件的点击事件。
- 在触摸事件场景下,触摸子组件,能够触发子组件的触摸事件,不会触发父组件的触摸事件。
- 关闭使能开关,在点击事件场景下,点击子组件,不触发子组件点击事件,但能够触发父组件点击事件。
- 在触摸事件场景下,触摸子组件,触发子组件的触摸事件和父组件的触摸事件。
实现思路
场景1:enabled的值为false时,点击Button按钮,会导致父组件的点击事件触发
对Button组件包裹一层容器组件,并设置hitTestBehavior属性, 属性值设置为HitTestMode.Block,可阻止事件的冒泡。具体代码可参考EventPropagation.ets。
@Component
struct ClickEvent {
// 初始化控制使能开关变量
@Consume isEnabled: boolean;
// 父组件响应次数
@State parentCompResponseTimes: number = 0;
build() {
Column() {
Text($r('app.string.click_event_title'))
.fontSize($r('app.integer.describe_text_font_size'))
.width('100%')
.margin($r('app.integer.common_space_size'))
.textAlign(TextAlign.Start)
Column() {
Text($r('app.string.parent_component_text'))
.fontSize($r('app.integer.parent_component_text_font_size'))
.margin($r('app.integer.common_space_size'))
// 父组件响应次数
Row() {
Text($r('app.string.parent_component_response_times_text'))
.fontSize($r('app.integer.response_text_font_size'))
Text(`${this.parentCompResponseTimes}`)
.fontSize($r('app.integer.response_text_font_size'))
}.margin({ top: $r('app.integer.common_space_size'), bottom: $r('app.integer.common_space_size') })
Column() {
Button(this.isEnabled ? $r('app.string.child_component_no_response') : $r('app.string.child_component_response'))
.enabled(false)
.fontSize($r('app.integer.child_component_font_size'))
.height($r('app.integer.button_height_size'))
.onClick(() => {
})
}
/*
TODO:知识点:在onClick事件里,需要将Button按钮包裹一层容器组件,在此容器组件通过使用hitTestBehavior来阻止事件冒泡(子组件向父组件透传onClick事件),
hitTestBehavior的属性值设置为HitTestMode.Block。
*/
.hitTestBehavior(this.isEnabled ? HitTestMode.Block : HitTestMode.Default)
}
.width($r('app.string.common_container_width'))
.height($r('app.integer.button_click_event_area_height'))
.backgroundColor($r('app.color.click_event_area_background_color'))
.alignItems(HorizontalAlign.Center)
.onClick(() => {
// 冒泡事件发生时,该回调不会触发
this.parentCompResponseTimes++;
})
}
}
}
场景2:触摸事件中,当子组件触发触摸事件的时候,父组件如果设置触摸事件的话,也会触发
在onTouch函数中执行event.stopPropagation()可阻止冒泡。具体代码可参考EventPropagation.ets
@Component
struct TouchEvent {
// 初始化控制使能开关变量
@Consume isEnabled: boolean;
// 父组件响应次数
@State parentCompResponseTimes: number = 0;
// 子组件响应次数
@State childCompResponseTimes: number = 0;
build() {
Column() {
Text($r('app.string.touch_event_title'))
.fontSize($r('app.integer.describe_text_font_size'))
.width('100%')
.margin($r('app.integer.common_space_size'))
.textAlign(TextAlign.Start)
Column() {
Text($r('app.string.parent_component_text_touch'))
.fontSize($r('app.integer.parent_component_text_font_size'))
.margin($r('app.integer.common_space_size'))
// 父组件响应次数
Row() {
Text($r('app.string.parent_component_response_times_text'))
.fontSize($r('app.integer.response_text_font_size'))
Text(`${this.parentCompResponseTimes}`)
.fontSize($r('app.integer.response_text_font_size'))
}.margin({ top: $r('app.integer.common_space_size'), bottom: $r('app.integer.common_space_size') })
// 子组件响应次数
Row() {
Text($r('app.string.child_component_response_times_text'))
.fontSize($r('app.integer.response_text_font_size'))
Text(`${this.childCompResponseTimes}`)
.fontSize($r('app.integer.response_text_font_size'))
}.margin({ bottom: $r('app.integer.common_space_size') })
Text(this.isEnabled ? $r('app.string.child_touch_component_no_response') : $r('app.string.child_touch_component_response'))
.height($r('app.integer.button_height_size'))
.textAlign(TextAlign.Center)
.backgroundColor(Color.White)
.padding($r('app.integer.common_space_size'))
.onTouch((event) => {
if (this.isEnabled) {
event.stopPropagation(); // TODO:知识点:在onTouch事件里,通过调用event.stopPropagation()阻止事件冒泡(子组件向父组件透传Touch事件)
}
this.childCompResponseTimes++;
})
}
.width($r('app.string.common_container_width'))
.height($r('app.integer.button_click_event_area_height'))
.backgroundColor($r('app.color.click_event_area_background_color'))
.margin($r('app.integer.common_space_size'))
.alignItems(HorizontalAlign.Center)
.onTouch(() => {
// 冒泡事件发生时,该回调不会触发
this.parentCompResponseTimes++;
})
}
}
}
高性能知识点
不涉及。
工程结构&模块类型
eventpropagation // har类型
|---view
| |---EventPropagationView.ets // 视图层-阻塞冒泡特性页面
模块依赖
本实例依赖common模块来实现资源的调用以及公共组件FunctionDescription的引用。
参考资料
学习鸿蒙开发势在必行。鸿蒙开发可参考学习文档:https://qr21.cn/FV7h05
HarmonyOS NEXT应用开发案例——阻塞事件冒泡的更多相关文章
- ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡
原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡 CompositeControl 后篇 --事件冒泡 系列文章链接: ASP.NET ...
- jquery防止事件冒泡和取消默认行为案例
----------------js取消事件冒泡: window.event.cancelBubble=true; --------------jquery事件参数可以防止事件冒泡: $(" ...
- javascript --- 事件冒泡与事件捕获
事件冒泡与事件捕获 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题.考虑下面这段代码,就不写html->head,body之类的代码了,自行 ...
- vue02 过滤器、计算和侦听属性、vue对象的生命周期、阻止事件冒泡和刷新页面
3. Vue对象提供的属性功能 3.1 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 定义过滤器的方式有两种. 3.1.1 使用Vue.fil ...
- 事件流之事件冒泡与事件捕获<JavaScript高级程序设计>学习笔记
1.事件流 浏览器开发团队遇到一个很有意思问题:页面的那一部分会拥有特定的事件? 对于理解这个问题您可以想象画在一张纸上的一组同心圆,如果你把手指放在圆心上,那么你的手指指向的其实不是一个圆,而是纸上 ...
- 解析Javascript事件冒泡机制
本资源引自: 解析Javascript事件冒泡机制 - 我的程序人生 - 博客频道 - CSDN.NET http://blog.csdn.net/luanlouis/article/details/ ...
- javascript中的事件冒泡、事件捕获和事件执行顺序
谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有 ...
- js之事件冒泡和事件捕获
(1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...
- js之事件冒泡和事件捕获详细介绍
(1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...
- js阻止冒泡及jquery阻止事件冒泡示例介绍
js阻止冒泡 在阻止冒泡的过程中,W3C和IE采用的不同的方法,那么我们必须做以下兼容. 复制代码 代码如下: function stopPro(evt){ var e = evt || window ...
随机推荐
- k8s是如何保障滚动升级时下线的pod不被访问
Kubernetes (k8s) 通过一系列机制保障在滚动升级时,下线的 Pod 不再被访问.以下是一些主要的保障措施: Service 抽象:在 Kubernetes 中,Pod 通常不是直接暴露给 ...
- stm32文件系统读写操作调试总结
一 问题 最近使用到了文件系统的读写,中间遇到了一些问题值得深思. 二 源码解析 创建文件: FRESULT res; do { sprintf(filename,"/sensor_si ...
- linux命令行下使用代理
有两种方法: 1.curl -x <proxy_ip>:<proxy_port> <real_website> 举例:curl -x 12.99.109.52:80 ...
- ffmpeg播放器-音视频解码流程
目录 音视频介绍 音视频解码流程 FFmpeg解码的数据结构说明 AVFormatContext数据结构说明 AVInputFormat数据结构说明 AVStream数据结构说明 AVCodecCon ...
- Linux DISPLAY环境变量的妙用(error:QXcbConnection: Could not connect to display) ,xhost 命令, 通过ssh连接显示界面
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 安装centos系统必做操作
关闭SELinux sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config 在Linux系统中临时关闭SELinux(Security-E ...
- 关于进程同步与互斥的一些概念(锁、cas、futex)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 无 前言 最近为了实现在android lin ...
- 首届实时渲染3D动画创作大赛最佳人气奖?你说了算!
根据评选标准,经过评委组层层选拔,首届实时渲染3D动画创作大赛「最佳人气奖」投票开始啦!!! 本次赛事报名人数达212人,入围作品共40份,其中Omniverse组11份,专业组15份,学生组14份. ...
- .Net Core 使用 TagProvider 与 Enricher 丰富日志
TagProvider [LogProperties] 与 [LogPropertyIgnore] 如果用在DTO不存在任何问题,如果用在Domain实体上,可能有点混乱. 您可能不希望因日志记录问 ...
- 安装npm install报错npm ERR! code ETIMEDOUT npm ERR! errno ETIMEDOUT npm ERR! network request to https://registry.npmjs.org/webpack-subresource-integrity failed, reason
执行命令:npm run dev 启动前端项目报如下错误,vue-cli-service是Vue一个启动的插件,需要安装 D:\nodejs\npm.cmd run dev > yuntan1h ...