【實踐所得】
<script>
import wepy from 'wepy'
import api from '../api/api'
export default class schoolQA extends wepy.page {
config = {
navigationBarTitleText: '學校問答'
}
data = {
nav: {
bar: ['問答投放', '問答清單'],
currentTab: 0
},
radioItems: [{
name: 7,
value: '7天'
}, {
name: 25,
value: '25天'
name: 30,
value: '30天'
}],
apiRes: {},
notHere: {},
input: {}
restVal() {
this.apiRes = {}
<input type="search" class="weui-search-bar__input" placeholder="請輸入關鍵詞" value="{{input.question}}" name="keyword" maxlength="30" auto-focus @input="getQARecommenderQ" />
通過
this.input={}
this.apiRes={}
來置空輸入資料,重置頁面
this.apiRes,this.input 作用可以認為是事件資料線
事件
事件是視圖層到邏輯層的通訊方式。
事件可以将使用者的行為回報到邏輯層進行處理。
事件可以綁定在元件上,當達到觸發事件,就會執行邏輯層中對應的事件處理函數。
事件對象可以攜帶額外資訊,如 id, dataset, touches。
在元件中綁定一個事件處理函數。
如<code>bindtap</code>,當使用者點選該元件的時候會在該頁面對應的Page中找到相應的事件處理函數。
在相應的Page定義中寫上相應的事件處理函數,參數是event。
可以看到log出來的資訊大緻如下:
事件分為冒泡事件和非冒泡事件:
冒泡事件:當一個元件上的事件被觸發後,該事件會向父節點傳遞。
非冒泡事件:當一個元件上的事件被觸發後,該事件不會向父節點傳遞。
WXML的冒泡事件清單:
<col>
類型
觸發條件
最低版本
touchstart
手指觸摸動作開始
touchmove
手指觸摸後移動
touchcancel
手指觸摸動作被打斷,如來電提醒,彈窗
touchend
手指觸摸動作結束
tap
手指觸摸後馬上離開
longpress
手指觸摸後,超過350ms再離開,如果指定了事件回調函數并觸發了這個事件,tap事件将不被觸發
1.5.0
longtap
手指觸摸後,超過350ms再離開(推薦使用longpress事件代替)
transitionend
會在 WXSS transition 或 wx.createAnimation 動畫結束後觸發
animationstart
會在一個 WXSS animation 動畫開始時觸發
animationiteration
會在一個 WXSS animation 一次疊代結束時觸發
animationend
會在一個 WXSS animation 動畫完成時觸發
touchforcechange
在支援 3D Touch 的 iPhone 裝置,重按時會觸發
1.9.90
注:除上表之外的其他元件自定義事件如無特殊聲明都是非冒泡事件,如<form/>的<code>submit</code>事件,<input/>的<code>input</code>事件,<scroll-view/>的<code>scroll</code>事件,(詳見各個元件)
事件綁定的寫法同元件的屬性,以 key、value 的形式。
key 以<code>bind</code>或<code>catch</code>開頭,然後跟上事件的類型,如<code>bindtap</code>、<code>catchtouchstart</code>。自基礎庫版本 1.5.0 起,在非原生元件中,<code>bind</code>和<code>catch</code>後可以緊跟一個冒号,其含義不變,如<code>bind:tap</code>、<code>catch:touchstart</code>。
value 是一個字元串,需要在對應的 Page 中定義同名的函數。不然當觸發事件的時候會報錯。
<code>bind</code>事件綁定不會阻止冒泡事件向上冒泡,<code>catch</code>事件綁定可以阻止冒泡事件向上冒泡。
如在下邊這個例子中,點選 inner view 會先後調用<code>handleTap3</code>和<code>handleTap2</code>(因為tap事件會冒泡到 middle view,而 middle view 阻止了 tap 事件冒泡,不再向父節點傳遞),點選 middle view 會觸發<code>handleTap2</code>,點選 outer view 會觸發<code>handleTap1</code>。
自基礎庫版本 1.5.0 起,觸摸類事件支援捕獲階段。捕獲階段位于冒泡階段之前,且在捕獲階段中,事件到達節點的順序與冒泡階段恰好相反。需要在捕獲階段監聽事件時,可以采用<code>capture-bind</code>、<code>capture-catch</code>關鍵字,後者将中斷捕獲階段和取消冒泡階段。
在下面的代碼中,點選 inner view 會先後調用<code>handleTap2</code>、<code>handleTap4</code>、<code>handleTap3</code>、<code>handleTap1</code>。
如果将上面代碼中的第一個<code>capture-bind</code>改為<code>capture-catch</code>,将隻觸發<code>handleTap2</code>。
如無特殊說明,當元件觸發事件時,邏輯層綁定該事件的處理函數會收到一個事件對象。
BaseEvent 基礎事件對象屬性清單:
屬性
說明
type
String
事件類型
timeStamp
Integer
事件生成時的時間戳
target
Object
觸發事件的元件的一些屬性值集合
currentTarget
目前元件的一些屬性值集合
CustomEvent 自定義事件對象屬性清單(繼承 BaseEvent):
detail
額外的資訊
TouchEvent 觸摸事件對象屬性清單(繼承 BaseEvent):
touches
Array
觸摸事件,目前停留在螢幕中的觸摸點資訊的數組
changedTouches
觸摸事件,目前變化的觸摸點資訊的數組
特殊事件: <code><canvas/></code> 中的觸摸事件不可冒泡,是以沒有 currentTarget。
代表事件的類型。
頁面打開到觸發事件所經過的毫秒數。
觸發事件的源元件。
id
事件源元件的id
tagName
目前元件的類型
dataset
事件源元件上由<code>data-</code>開頭的自定義屬性組成的集合
事件綁定的目前元件。
目前元件的id
目前元件上由<code>data-</code>開頭的自定義屬性組成的集合
說明: target 和 currentTarget 可以參考上例中,點選 inner view 時,<code>handleTap3</code> 收到的事件對象 target 和 currentTarget 都是 inner,而 <code>handleTap2</code> 收到的事件對象 target 就是 inner,currentTarget 就是 middle。
在元件中可以定義資料,這些資料将會通過事件傳遞給 SERVICE。 書寫方式: 以<code>data-</code>開頭,多個單詞由連字元<code>-</code>連結,不能有大寫(大寫會自動轉成小寫)如<code>data-element-type</code>,最終在 event.currentTarget.dataset 中會将連字元轉成駝峰<code>elementType</code>。
示例:
touches 是一個數組,每個元素為一個 Touch 對象(canvas 觸摸事件中攜帶的 touches 是 CanvasTouch 數組)。 表示目前停留在螢幕上的觸摸點。
identifier
Number
觸摸點的辨別符
pageX, pageY
距離文檔左上角的距離,文檔的左上角為原點 ,橫向為X軸,縱向為Y軸
clientX, clientY
距離頁面可顯示區域(螢幕除去導覽列)左上角距離,橫向為X軸,縱向為Y軸
特殊說明
x, y
距離 Canvas 左上角的距離,Canvas 的左上角為原點 ,橫向為X軸,縱向為Y軸
changedTouches 資料格式同 touches。 表示有變化的觸摸點,如從無變有(touchstart),位置變化(touchmove),從有變無(touchend、touchcancel)。
自定義事件所攜帶的資料,如表單元件的送出事件會攜帶使用者的輸入,媒體的錯誤事件會攜帶錯誤資訊,詳見元件定義中各個事件的定義。
點選事件的<code>detail</code> 帶有的 x, y 同 pageX, pageY 代表距離文檔左上角的距離。