1. 程式人生 > 實用技巧 >微信小程式:事件繫結

微信小程式:事件繫結

小程式中繫結事件,通過bind關鍵字來實現。如bindinput,bindtap(繫結點選事件)bindchange等。

什麼是事件

  • 事件是檢視層到邏輯層的通訊方式。
  • 事件可以將使用者的行為反饋到邏輯層進行處理。
  • 事件可以繫結在元件上,當達到觸發事件,就會執行邏輯層中對應的事件處理函式。
  • 事件物件可以攜帶額外資訊,如 id, dataset, touches

事件的使用方式

1、在元件中繫結一個事件處理函式。

bindtap,當用戶點選該元件的時候會在該頁面對應的Page中找到相應的事件處理函式。

<view id="tapTest" data-hi="Weixin" bindtap="
tapName"> Click me! </view>

2、在相應的Page定義中寫上相應的事件處理函式,引數是event。

Page({
  tapName: function(event) {
    console.log(event)
  }
})

可以看到log出來的資訊大致如下:注意view標籤的id屬性值為e.currentTarget.id,自定義屬性hi值為:e.currentTarget.dataset.hi,

{
  "type":"tap",
  "timeStamp":895,
  "target": {
    "id": "tapTest"
, "dataset": { "hi":"Weixin" } }, "currentTarget": { "id": "tapTest", "dataset": { "hi":"Weixin" } }, "detail": { "x":53, "y":14 }, "touches":[{ "identifier":0, "pageX":53, "pageY":14, "clientX":53, "clientY":14 }], "changedTouches
":[{ "identifier":0, "pageX":53, "pageY":14, "clientX":53, "clientY":14 }] }

事件分類:

事件分為冒泡事件和非冒泡事件:

  1. 冒泡事件:當一個元件上的事件被觸發後,該事件會向父節點傳遞。
  2. 非冒泡事件:當一個元件上的事件被觸發後,該事件不會向父節點傳遞。

WXML的冒泡事件列表:

touchstart:手指觸控動作開始

touchmove:手指觸控後移動

touchcancel:手指觸控動作被打斷,如來電提醒,彈窗

touchend:手指觸控動作結束

tap:手指觸控後馬上離開

longpress:手指觸控後,超過350ms再離開,如果指定了事件回撥函式並觸發了這個事件,tap事件將不被觸發

longtap:手指觸控後,超過350ms再離開(推薦使用longpress事件代替)

transitionend:會在 WXSS transition 或 wx.createAnimation 動畫結束後觸發

animationstart:會在一個 WXSS animation 動畫開始時觸發

animationiteration:會在一個 WXSS animation 一次迭代結束時觸發

animationend:會在一個 WXSS animation 動畫完成時觸發

touchforcechange:在支援 3D Touch 的 iPhone 裝置,重按時會觸發

注:除上表之外的其他元件自定義事件如無特殊宣告都是非冒泡事件,如formsubmit事件,inputinput事件,scroll-viewscroll事件,(詳見各個元件)

一、繫結輸入事件bindinput

1、需要給input標籤繫結input事件,這個事件bindinput在當值改變時就會觸發

2、編寫input事件的執行邏輯。

3、通過事件源物件(e)來獲取輸入框中的值(e.detail.value),然後賦值給num.

把輸入框的值賦值給data當中使用setData方法

獲取輸入框的值(e.detail.value)自定義屬性(e.currentTarget.dataset .xxx)都是從事件源物件(e)獲取的。

獲取data資料模型中的值是通過this.data.xx來獲取的。注意:微信小程式中獲取資料模型中的值和給資料模型中的屬性賦值都與vue中的不一樣。

二、繫結單擊事件bindtap

繫結事件的時候不能直接進行傳參,否則會將方法名連同引數一起當作方法名。只能通過自定義屬性的方式傳參

自定義屬性 operation,

獲取輸入框的值:e.detail.value;獲取自定義屬性的值:e.currentTarget.dataset.xxx;給data中的屬性賦值:this.setData();獲取data資料模型中的值:this.data.xxx;

繫結事件時不能帶引數,不能帶括號。事件傳值通過自定義屬性的方式。在事件觸發時獲取資料。