#前言 接上篇,因項目需由H5轉到小程序,故需打造自定義對話框。而這塊需使用到微信小程序的自定義組件功能。html
點擊此處,能夠查看小程序自定義組件的api。 從自定義組件的樣例中,咱們瞭解到,其實自定義組件的頁面構成和小程序的正常頁面構成是同樣的;都有本身的wxml、wxss、js、json。惟一須要注意的是js內容不同
以及json
須要聲明爲組件。json
###dialog.wxml小程序
<view wx:if="{{visible}}"> <view class="mask" wx:if="{{mask}}"> </view> <view class="dialog"> <view> <image src="/assets/image/dialog/dialog.png" mode="widthFix"></image> </view> <view class="message"> <view class="title">{{title}}</view> <view class="text">{{text}}</view> <view class="btn"> <view class="sure {{item.cancle?'cancle':''}}" wx:for="{{buttons}}" data-index="{{index}}" catchtap="btnAction">{{item.title}}</view> </view> </view> </view> </view>
###dialog.wxss微信小程序
樣式省略...
###dialog.jsonapi
{ "component": true }
###dialog.js數組
Component({ properties: { btnOpts: { type: Object, observer: '_dialog' } }, data: { visible: false,//是否顯示 mask: true, //是否顯示mask title: '', //提示標題 text: '', //提示文字 buttons: [],//按鈕信息 }, methods: { btnAction(e) { let index = e.currentTarget.dataset.index; let button = this.data.buttons[index]; if (button.eventName !== undefined) { let detail = { index: index } this.triggerEvent(button.eventName, detail, {}) } }, _dialog(btnOpts, oldVal) { this.setData({ visible: btnOpts.visible, title: btnOpts.title === undefined ? '' : btnOpts.title, text: btnOpts.text === undefined ? '' : btnOpts.text, buttons: btnOpts.buttons === undefined ? [] : btnOpts.buttons, }); } } })
在此處遇到的問題是,小程序data中,不能傳入函數;即便傳入了,小程序data也會過濾掉。故此處使用了triggerEvent
也就是讓組件觸發頁面事件(組件事件說明API)微信
而個人對話框,可能有一個按鈕或者多個按鈕,故將按鈕定義爲數組對象。xss
最後看看在普通頁面中如何調用組件。 ##普通頁面中如何調用組件 ###在調用頁面的json中引入組件函數
{ "usingComponents": { "dialog": "/pages/components/dialog/dialog" } }
###在view頁面中使用組件標籤this
<view class="submit" catchtap="submit"> 提交 </view> <dialog btnOpts="{{btnOpts}}" bindbtnevent="submit"></dialog>
###在js中聲明使用的屬性數據
... ... data: { btnOpts: '', } ... ... submit(e) { let btnOpts = { visible: true, title: '舒適提示', text: '恭喜,您抽中了300個寵物蛋~', buttons: [{ title: '肯定', eventName: 'btnevent',//觸發組建自定義事件 handler: () => { //關閉對話框 let btnOpts = { visible: false, }; this.setData({ btnOpts: btnOpts }); } }], } let triggerEventIndex = e.detail.index; if (triggerEventIndex === undefined) { this.setData({ btnOpts: btnOpts }); } else { let button = btnOpts.buttons[triggerEventIndex]; if (button && typeof button.handler === "function") { button.handler(); } } },
上面的代碼在本頁面按鈕點擊的時候會調用;在組件彈出對話框的按鈕點擊確認的時候也會調用。
因組件能經過e.detail屬性傳值,在點擊的時候,就能知道點擊的是哪一個按鈕;
故只須要組件回傳給我按鈕的數組index便可知道須要執行的函數;
解決了在data中不能傳入函數以及在本頁面代碼冗餘的問題。