我們都知道小程序的默認的基本事件(比如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也在上面,所以一定可以取到。如果你的頁面比較複雜,層級比較多,就要特別注意這一點了。
好了,結束,感謝你的閱讀~~