关于Taro 中的事件冒泡的坑

简介: 在小程序中 天生有catchTap事件可以阻断事件冒泡所以可以<view catchTap="clickHandler"></view>复制代码来阻止事件传播在taro中 官方推荐使用e.stopPropagation()阻断事件冒泡但是在小程序中 e.stopPropagation() 是一个空函数

在小程序中 天生有catchTap事件可以阻断事件冒泡


所以可以


<view catchTap="clickHandler"></view>
复制代码


来阻止事件传播


在taro中 官方推荐使用e.stopPropagation()阻断事件冒泡


但是在小程序中 e.stopPropagation() 是一个空函数


image.png


实际上调用这个函数是没有任何作用的 那Taro是如何使用这个函数阻止事件冒泡的呢

答案就是Taro在编译时 发现这个handler中有调用e.stopPropagation() 将把事件绑定方法从onTap改成catchTap


image.png


那我们直接在taro中使用catchTap可以吗?


首先 我们试试使用匿名函数 直接将处理函数写在jsx内


image.png


编译后得到的是


image.png


image.png


这个时候 catchTap所绑定的方法 变成了anonymousState__temp2 这个东西不是一个注册在组件内部的方法 小程序的事件绑定会以字符串的形式触发注册在组件根部的方法,这个没有注册在组件根部,所以是不行的。


然后我们试试绑定在成员函数上面


image.png


taro的输出变成了


image.png


image.png


看起来很美好 感觉成功就在眼前了


然而


image.png

为什么找不到这个方法呢 这个方法不是被注册在了this上面吗?


我们点进这个黄色的warning 打个断点看看


代码是这样的


image.png

命中断点后是这样的


image.png


我们发现这个Object一干二净上面连一个handler方法都没有


image.png


展开_


proto_


原来这些方法被定义在了原型链上


仔细找了一下 发现原型链上注册的这些方法并不包含onClearSearch 这个方法

应该是Taro发现只有需要作为事件处理的方法才会被定义在原型链上

这个catchTap对于Taro来说并不算是事件处理的方法


那我们是不是只要想办法让onClearSearch这个方法出现在原型链上就可以了呢

换句话说只要让Taro把他认作是事件处理方法注册在对象的原型上我们就可以调用到了

那我们将onClick和catchTap都绑上这个事件 因为Taro应该是认识onClick的 必须会把onClick的事件注册到原型链上


image.png


编译后是这样的


image.png


这次我们发现 onClearSearch 这个方法终于出现在了原型链上 而且也能调用成功了


image.png


结论



如果在jsx里面写匿名时间处理函数 可以直接写


<View 
    onClick=(e)=>{
      e.stopPropagation()
      //balabala
    }
>
</View>
复制代码


Taro编译时检测到stopPropagation后会直接将onClick变成catchTap


如果要将事件处理函数绑定在成员方法上如 则可以写成


<Text 
      catchTap={this.onClearSearch}
      onClick={this.onClearSearch}
 />




相关文章
|
小程序 前端开发
阻止小程序事件冒泡的三种方法
阻止小程序事件冒泡的三种方法
1820 0
|
9月前
|
人工智能 边缘计算 搜索推荐
从经验管理到智能分析:2025年健身房会员运营的数字化转型及工具选型
本简介介绍了健身房会员管理系统的四代技术演进,从纸质档案到AIoT智能系统的发展路径。分析了当前数字化管理的新需求,如多模态交互、智能合约与数字孪生等前沿技术应用。同时,系统讲解了智能会员管理系统的核心功能模块、关键技术实现与主流工具选型评估体系,并提出了系统实施策略与常见问题解决方案。展望未来,元宇宙、生成式AI和边缘计算将推动健身管理向更智能、个性化的方向发展,全面提升运营效率与会员体验。
550 0
|
6月前
|
机器学习/深度学习 人工智能 前端开发
终端里的 AI 编程助手:OpenCode 使用指南
OpenCode 是开源的终端 AI 编码助手,支持 Claude、GPT-4 等模型,可在命令行完成代码编写、Bug 修复、项目重构。提供原生终端界面和上下文感知能力,适合全栈开发者和终端用户使用。
49968 11
|
存储 弹性计算 数据挖掘
阿里云4核8G云服务器价格多少钱?2024年阿里云4核8G云服务器价格及性能测评参考
2024年,阿里云针对4核8G配置的云服务器提供了多种实例规格,包括经济型e实例、通用算力型u1、计算型c7等。这些不同实例规格的服务器在性能参数和费用上都有所不同,以满足不同用户的需求。其中,通用算力型u1实例的4核8G云服务器在价格上表现出色。新用户专享活动价仅需955.58元一年,折合每月仅需80元。这一价格相较于同类产品来说,性价比极高。同时,该服务器配备了高性能的ESSD云盘,能够确保用户在存储操作系统、应用程序和数据时获得最佳体验。
880 0
|
前端开发 JavaScript Python
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
在前后端分离的Web应用开发模式中,如何实现前后端之间的实时数据交换成为了一个重要议题。传统的轮询或长轮询方式在实时性、资源消耗和服务器压力方面存在明显不足,而WebSocket技术的出现则为这一问题提供了优雅的解决方案。本文将通过实战案例,详细介绍如何在Python Web应用中运用WebSocket技术,实现前后端之间的实时数据交换。
506 0
|
JavaScript
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用
|
机器学习/深度学习 自然语言处理 前端开发
前端大模型入门:Transformer.js 和 Xenova-引领浏览器端的机器学习变革
除了调用API接口使用Transformer技术,你是否想过在浏览器中运行大模型?Xenova团队推出的Transformer.js,基于JavaScript,让开发者能在浏览器中本地加载和执行预训练模型,无需依赖服务器。该库利用WebAssembly和WebGPU技术,大幅提升性能,尤其适合隐私保护、离线应用和低延迟交互场景。无论是NLP任务还是实时文本生成,Transformer.js都提供了强大支持,成为构建浏览器AI应用的核心工具。
3293 1
|
数据采集 Web App开发 JavaScript
Puppeteer动态代理实战:提升数据抓取效率
使用Puppeteer进行网页抓取时,通过动态代理提高效率。配置代理服务器如亿牛云,结合`puppeteer.launch`设置代理参数。导航至目标网页,等待图片加载,然后抓取并下载图片资源。代理有助于避开反爬策略,确保数据抓取的稳定性和效率。
448 4
Puppeteer动态代理实战:提升数据抓取效率