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




相关文章
|
前端开发
JSX-绑定事件
JSX-绑定事件
79 0
|
7月前
|
JavaScript
事件触发、事件捕获与事件冒泡(js的问题)
事件触发、事件捕获与事件冒泡(js的问题)
42 0
|
3月前
|
JavaScript
vue键盘事件
vue学习(11)键盘事件
|
3月前
|
JavaScript
vue学习(11)键盘事件
vue学习(11)键盘事件
54 2
|
JavaScript
Vue键盘事件
Vue键盘事件
|
7月前
|
JavaScript 前端开发
vue事件绑定
vue事件绑定
76 1
|
7月前
|
JavaScript 前端开发
Vue如何监听键盘事件
Vue如何监听键盘事件
216 0
|
7月前
|
前端开发 JavaScript 开发者
如何在React中监听键盘事件
如何在React中监听键盘事件
212 0
|
7月前
|
JavaScript 前端开发
【面试题】对JS中的事件冒泡、事件捕获、事件委托的理解
【面试题】对JS中的事件冒泡、事件捕获、事件委托的理解