小程序開發已經用三脚貓功夫做了一些粗略的實現,接下來就是學習這個技術框架中的細節,并且返工之前粗略、粗糙的地方。今天學習了一下幾個技術技巧:
一、子控件向父控件發送帶參數事件消息
頁面上的button按鈕是我做的一個子控件、這個按鈕是放在panel控件中的。現在我想點擊button按鈕的時候,button按鈕完成響應、并將事件通知給panel,由panel接收並繼續處理事件。
此前的實現非常拙劣,就是只使用panel進行事件的處理:
<panel bind:tap="running"></panel>
這樣做的壞處是顯然的:觸摸會發生在整個panel中。而我希望的是觸摸僅由裏面的button受理。改造過程如下:
1、首先panel的頁面層,調整代碼如下:
<panel bind:customEvent="running"></panel>
這樣調整之後,panel不再接受bind:tap消息,而是會接收名爲customEvent的事件,一旦接收到customEvent事件,則進行running執行。此時的customEvent事件將由button發出,所以button的代碼寫成下面的形式:
<button bind:tap="sendEvent"></button>
這樣只要點擊了button,就會運行sendEvent方法,這個方法内實現向父層發出消息的過程,具體js代碼是:
methods: {
sendEvent: function() {
const data = {varKey: 'value'};
this.triggerEvent('customEvent', data);
}
}
通過triggerEvent發出了一個customEvent事件,父控件因爲綁定了這個事件、接收到並開始處理就可以了。
二、動態成員訪問的方法
類似如下的PHP代碼:
<?PHP
$arr = ['name'=>'john', 'sex'=>'male', 'age'=>18];
$skey = 'name';
print $arr[$skey];
// 如果是對象結構,PHP中使用->訪問
print $arr->$skey;
?>
在JavaScript中的實現方式是:
const testData = [a, b, c, d];
var index = 2;
console.log(testData[index]);
// 無論是數組還是對象結構,都是如上的方式進行訪問
console.log(objStruct[skey])
三、控件數據初始化
微信小程序的components控件,似乎沒有(我不確定)如pages頁面那樣的onLoad()方法,儅加載了一個小控件之後,向這個控件中傳入一些初始變量,便沒有辦法找到一個Init()或onLoad()的地方,對這些傳進來的變量進行預處理、以被在頁面上使用。
此時可以使用控件的observers監聽服務,對傳遞進來的變量進行監控,一旦傳遞進來的變量生效,observers服務啓動,以便進行數據的預處理操作。具體代碼如下:
Component({
properties: {
incomeVarA = null,
labelText = ''
},
// observers監聽
observers: {
// 黨incomeVarA變量發生變化的時候
'incomeVarA': function(incomeVarA) {
if(incomeVarA) {
// 取出需要的内容,賦值給當前控件的labelText變量
this.setData({
labelText: incomeVarA.title
});
}
}
}
}
四、頁面中的if/else流控方式
此前頁面中一直是這麽寫:
<view wx:if="{{labelText == ''}}">沒有數據</view>
<view wx:if="{{labelText != ''}}">{{labelText}}</view>
現在有了更好的方法:
<view wx:if="{{labelText == ''}}">沒有數據</view>
<view wx:else">{{labelText}}</view>
雖然在頁面上的if/else流控寫法我已經瞭解了,但感覺并不如C/C++那樣直觀,總感覺有些奇怪,擔心它的嵌套不準確。不過也不重要,總之今天掌握的,就是這些。