小程序事件冒泡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也在上面,所以一定可以取到。如果你的頁面比較複雜,層級比較多,就要特別注意這一點了。

  好了,結束,感謝你的閱讀~~

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