关于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}
 />




目录
打赏
0
0
0
0
10
分享
相关文章
919. 【前端】Taro.useShareAppMessage 自定义分享封面
919. 【前端】Taro.useShareAppMessage 自定义分享封面
759 2
微信外部浏览器或短信链接唤起微信小程序的解决方案
微信外部浏览器或短信链接唤起微信小程序的解决方案
2171 1
微信的openid是用户的唯一id吗?
【10月更文挑战第4天】微信的openid是用户的唯一id吗?
1878 5
uniapp中使用videojs构建H5直播播放器
【10月更文挑战第14天】这两天在开发H5直播带货功能模块,使用原生的video播放器播放不了m3u8的流地址,于是找了videojs,参考了网上的一些资料研究了一下,感觉还不错,videojs播放m3u8流地址还挺稳定的,下面就简单记录一下uniapp里面使用方式
shouldComponentUpdate/componentWillUpdate/componentDidUpdate 这三个生命周期方法的执行顺序是怎样的?
【10月更文挑战第27天】在React 17中,`componentWillUpdate` 已被标记为不安全的生命周期方法,不建议使用,推荐使用 `getSnapshotBeforeUpdate` 方法来替代它在某些特定场景下的功能。同时,React 17还对一些生命周期方法的执行时机和行为进行了一些调整和优化,以更好地适应现代前端开发的需求和提高性能。
248 3
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用
【微信小程序】英文字母不换行问题 flex布局字符超出宽度折行问题:设置了word-break: break-all;和flex: 1;冲突flex不生效问题
【微信小程序】英文字母不换行问题 flex布局字符超出宽度折行问题:设置了word-break: break-all;和flex: 1;冲突flex不生效问题
373 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问