介绍

本示例主要介绍在点击事件中,子组件enabled属性设置为false的时候,如何解决点击子组件模块区域会触发父组件的点击事件问题;以及触摸事件中当子组件触发触摸事件的时候,父组件如果设置触摸事件的话,如何解决父组件也会被触发的问题。

效果图预览

使用说明

  1. 开启使能开关,在点击事件场景下,点击子组件,不能触发本身和父组件的点击事件。
  2. 在触摸事件场景下,触摸子组件,能够触发子组件的触摸事件,不会触发父组件的触摸事件。
  3. 关闭使能开关,在点击事件场景下,点击子组件,不触发子组件点击事件,但能够触发父组件点击事件。
  4. 在触摸事件场景下,触摸子组件,触发子组件的触摸事件和父组件的触摸事件。

实现思路

场景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的引用。

参考资料

触摸测试控制(hitTestBehavior)

触摸事件(onTouch)

学习鸿蒙开发势在必行。鸿蒙开发可参考学习文档:https://qr21.cn/FV7h05

HarmonyOS NEXT应用开发案例——阻塞事件冒泡的更多相关文章

  1. ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡

    原文:ASP.NET自定义控件组件开发 第四章 组合控件开发CompositeControl 后篇 --事件冒泡 CompositeControl  后篇 --事件冒泡 系列文章链接: ASP.NET ...

  2. jquery防止事件冒泡和取消默认行为案例

    ----------------js取消事件冒泡: window.event.cancelBubble=true; --------------jquery事件参数可以防止事件冒泡: $(" ...

  3. javascript --- 事件冒泡与事件捕获

    事件冒泡与事件捕获 事件冒泡和事件捕获分别由微软和网景公司提出,这两个概念都是为了解决页面中事件流(事件发生顺序)的问题.考虑下面这段代码,就不写html->head,body之类的代码了,自行 ...

  4. vue02 过滤器、计算和侦听属性、vue对象的生命周期、阻止事件冒泡和刷新页面

    3. Vue对象提供的属性功能 3.1 过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 定义过滤器的方式有两种. 3.1.1 使用Vue.fil ...

  5. 事件流之事件冒泡与事件捕获<JavaScript高级程序设计>学习笔记

    1.事件流 浏览器开发团队遇到一个很有意思问题:页面的那一部分会拥有特定的事件? 对于理解这个问题您可以想象画在一张纸上的一组同心圆,如果你把手指放在圆心上,那么你的手指指向的其实不是一个圆,而是纸上 ...

  6. 解析Javascript事件冒泡机制

    本资源引自: 解析Javascript事件冒泡机制 - 我的程序人生 - 博客频道 - CSDN.NET http://blog.csdn.net/luanlouis/article/details/ ...

  7. javascript中的事件冒泡、事件捕获和事件执行顺序

    谈起JavaScript的 事件,事件冒泡.事件捕获.阻止默认事件这三个话题,无论是面试还是在平时的工作中,都很难避免. DOM事件标准定义了两种事件流,这两种事件流有着显著的不同并且可能对你的应用有 ...

  8. js之事件冒泡和事件捕获

    (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...

  9. js之事件冒泡和事件捕获详细介绍

    (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...

  10. js阻止冒泡及jquery阻止事件冒泡示例介绍

    js阻止冒泡 在阻止冒泡的过程中,W3C和IE采用的不同的方法,那么我们必须做以下兼容. 复制代码 代码如下: function stopPro(evt){ var e = evt || window ...

随机推荐

  1. pcm5102芯片解析之基本概念

    一 前记 1 在音频领域深耕,那就要不断的前行.最近有几个项目需要用到pcm5102这颗料,藉此机会,针对这个料进行深入的研究一下.做一一些简要的分析. 二 概念 音频芯片的指标,其实,很多年都没啥变 ...

  2. 可穿戴心电ECG监测的技术路径及特点

    在传统的医疗设备中,监测心跳速率和心脏活动是经由测量电生理讯号与心电图 (ECG) 来完成的,需要将电极连接到身体来量测心脏组织中所引发电气活动的信号.常见的设备用医院的心电图机,长期监护的动态心电仪 ...

  3. MediaBox音视频终端SDK已适配鸿蒙星河版(HarmonyOS NEXT)

    2024年1月,HarmonyOS NEXT 鸿蒙星河版系统开发者预览版开放申请,该系统将只能安装为鸿蒙开发的原生应用,而不再兼容安卓应用.对此,阿里云MediaBox音视频终端SDK产品已实现功能的 ...

  4. [Raspberry Pi]树莓派多线程下串口收发数据

    [Raspberry Pi]树莓派多线程下串口收发数据 鼠鼠用的是python开发树莓派,因为python是最优美的语言! 少废话,直接上代码: import threading import ser ...

  5. 天天用defineEmits宏函数,竟然不知道编译后是vue2的选项式API?

    前言 我们每天都在使用 defineEmits 宏函数,但是你知道defineEmits 宏函数经过编译后其实就是vue2的选项式API吗?通过回答下面两个问题,我将逐步为你揭秘defineEmits ...

  6. 记录--纯CSS实现骚气红丝带

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在本文中,我们将探讨如何使用 CSS 以最少的代码创造出精美的 CSS 丝带形状,并最终实现下面这个效果: 下面我们使用html和css来 ...

  7. SpringBoot项目 填充Excel模板 导出 下载

    模板 下载后的效果 项目结构 pom <?xml version="1.0" encoding="UTF-8"?> <project xmln ...

  8. Linux服务器程序规范化

    Linux日志体系 rsyslogd守护进程既能接收用户进程输出的日志,又能接收内核日志.用户进程是通过调用syslog函数生成系统日志的.该函数将日志输出到一个UNIX本地域socket类型(AF_ ...

  9. VS2022+QT5.14.2开发VS QT Tool的使用

    1.安装环境vs2022+QT5.14.2 qt vs tool (vsaddin)的使用遇到的坑 1.安装qt-vsaddin-msvc2022-3.0.2.vsix 安装失败 2.安装qt-vsa ...

  10. 18 JavaScript中的三元运算

    18 JavaScript中的三元运算 先来看一个例子: let a = 10; let b = 20; let d = a > b? a: b console.log(d); // 20 三元 ...