小程序事件冒泡dataset的取值注意事项(易出错)

  我们都知道小程序的默认的基本事件(比如touch类,tap等等)都具有冒泡特性,也就是事件会向父级节点传递,所以这就会导致出现一些问题,当然小程序也有阻止冒泡的绑定方法,这里就不说,主要说冒泡的情况。
  这里容易出问题的地方在事件对象中的两个属性:target和currentTarget,先来看看官方的定义:target:触发事件的源组件;currentTarget:事件绑定的当前组件。从定义上也不难理解,target是触发事件的那个组件属性,currentTarget就是绑定事件的那个组件的属性。比如tap事件,target就是点击那个组件的属性,currentTarget就是有bindtap的那个组件的属性。为什么要说这两个属性?因为这两个属性里面都有dataset属性,即我们从组件上获取设定的值的属性,如果在冒泡事件中没有弄清楚到底取target还是currentTarget的,最终可能会取不到。下面就来看看具体的例子。
  wxml代码:

  <view  bindtap="testTap" data-key="1" style="background:black;color:white;margin-top:10rpx">
    <text>父组件</text> 
    <view style="background:red;margin-top:10rpx"> 
        子组件
    </view>
  </view>

  js代码

Page({
  testTap(e){
    console.log("target的dataset==>",e.target.dataset);
    console.log("currentTarget的dataset==>" ,e.currentTarget.dataset);
  }
})

  这里tap事件是绑定在父组件上的,而data-key也是设置在父组件上,当点击父组件的时候,看下图:
在这里插入图片描述
可以看到target和currentTarget的dataset都是有值的,触发事件的组件是父组件,那么target就是父组件的信息;绑定事件的也是父组件,那么currentTarget也是父组件的信息。但是如果点击子组件的时候呢?看下图:
在这里插入图片描述
可以看到触发组件,target是没有dataset信息的,因为这是父组件上的,而currentTarget是绑定事件的,所以他是有dataset值的。
  上面这个例子是bind和data都是在同一个组件上的,如果不在同一组件上,那就不管哪个触发事件都不一定能取到值,就上面的例子把bindtap和data-key分别放在父子组件上,这时候就不能确定target还是currentTarget能取到值的,情况不同。所以这里只讨论在同一个组件上的情况,要注意的就是,不管哪里触发事件要取dataset都能取到值的一定要取 currentTarget 的dataset,也就是绑定事件的那个组件,以为data-key也在上面,所以一定可以取到。如果你的页面比较复杂,层级比较多,就要特别注意这一点了。

  好了,结束,感谢你的阅读~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章