微信小程序中的組件
前言
之前做小程序開發(fā)的時(shí)候,對(duì)于開發(fā)來說比較頭疼的莫過于自定義組件了,當(dāng)時(shí)官方對(duì)這方面的文檔也只是寥寥幾句式矫,一筆帶過而已,所以寫起來真的是非常非常痛苦R鄹采转!
好在微信小程序的庫從 1.6.3 開始,官方對(duì)于自定義組件這一塊有了比較大的變動(dòng)瞬痘,首先比較明顯的感覺就是文檔比以前全多了故慈,有木有0逍堋(小程序文檔),現(xiàn)在小程序支持簡(jiǎn)潔的組件化編程察绷,可以將頁面內(nèi)的功能模塊抽象成自定義組件干签,以便在不同的頁面中復(fù)用,提高自己代碼的可讀性克婶,降低自己維護(hù)代碼的成本筒严!
本篇文章就是手把手教你實(shí)現(xiàn)小程序中自定義組件,坐穩(wěn)啦~
具體實(shí)現(xiàn)
要做自定義組件情萤,我們先定一個(gè)小目標(biāo),比如說我們?cè)谛〕绦蛑袑?shí)現(xiàn)一下 WEUI 中的彈窗組件摹恨,基本效果圖如下筋岛。
WEUI彈框
Step1
我們初始化一個(gè)小程序(本示例基礎(chǔ)版本庫為 1.7 ),刪掉里面的示例代碼晒哄,并新建一個(gè)components文件夾睁宰,用于存放我們以后開發(fā)中的所用組件,今天我們的目的是實(shí)現(xiàn)一個(gè) 彈框 組件寝凌,因此柒傻,我們?cè)赾omponents組件中新建一個(gè)Dialog文件夾來存放我們的彈窗組件,在Dialog下右擊新建Component并命名為dialog后较木,會(huì)生成對(duì)應(yīng)的json wxml wxss js4個(gè)文件红符,也就是一個(gè)自定義組件的組成部分,此時(shí)你的項(xiàng)目結(jié)構(gòu)應(yīng)該如下圖所示:
項(xiàng)目結(jié)構(gòu)
Step2
組件初始化工作準(zhǔn)備完成伐债,接下來就是組件的相關(guān)配置预侯,首先我們需要聲明自定義組件,也就是將dialog.json中component字段設(shè)為true:
{"component":true,// 自定義組件聲明"usingComponents": {}// 可選項(xiàng)峰锁,用于引用別的組件}
其次萎馅,我們需要在dialog.wxml文件中編寫彈窗組件模版,在dialog.wxss文件中加入彈窗組件樣式虹蒋,它們的寫法與頁面的寫法類似糜芳,我就不贅述,直接貼代碼啦~
dialog.wxml文件如下:
{{ title }}{{ content }}{{ cancelText }}{{ confirmText }}
dialog.wxss文件如下:
/* components/Dialog/dialog.wxss */.wx-mask{position: fixed;z-index:1000;top:0;right:0;left:0;bottom:0;background:rgba(0, 0, 0, 0.3);}.wx-dialog{position: fixed;z-index:5000;width:80%;max-width:600rpx;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);transform:translate(-50%, -50%);background-color:#FFFFFF;text-align: center;border-radius:3px;overflow: hidden;}.wx-dialog-title{font-size:18px;padding:15px15px5px;}.wx-dialog-content{padding:15px15px5px;min-height:40px;font-size:16px;line-height:1.3;word-wrap: break-word;word-break: break-all;color:#999999;}.wx-dialog-footer{display: flex;align-items: center;position: relative;line-height:45px;font-size:17px;}.wx-dialog-footer::before{content:'';position: absolute;left:0;top:0;right:0;height:1px;border-top:1pxsolid#D5D5D6;color:#D5D5D6;-webkit-transform-origin:00;transform-origin:00;-webkit-transform:scaleY(0.5);transform:scaleY(0.5);}.wx-dialog-btn{display: block;-webkit-flex:1;flex:1;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);position: relative;}.wx-dialog-footer.wx-dialog-btn:nth-of-type(1){color:#353535;}.wx-dialog-footer.wx-dialog-btn:nth-of-type(2){color:#3CC51F;}.wx-dialog-footer.wx-dialog-btn:nth-of-type(2):after{content:" ";position: absolute;left:0;top:0;width:1px;bottom:0;border-left:1pxsolid#D5D5D6;color:#D5D5D6;-webkit-transform-origin:00;transform-origin:00;-webkit-transform:scaleX(0.5);transform:scaleX(0.5);}
step3
組件的結(jié)構(gòu)和樣式都有了魄衅,還缺少什么呢峭竣,沒錯(cuò),還缺js徐绑, 眼睛比較犀利的同學(xué)邪驮,可能已經(jīng)發(fā)現(xiàn)了我們?cè)赿ialog.wxml文件中的會(huì)有一些比如{{ isShow }}、{{ title }}這樣的模版變量傲茄,還定義了_cancelEvent和_confirmEvent兩個(gè)方法毅访,其具體實(shí)現(xiàn)就是在dialog.js中沮榜。
dialog.js是自定義組件的構(gòu)造器,是使用小程序中Component構(gòu)造器生成的喻粹,調(diào)用Component構(gòu)造器時(shí)可以用來指定自定義組件的屬性蟆融、數(shù)據(jù)、方法等守呜,具體的細(xì)節(jié)可以參考一下官方的文檔
下面我通過代碼注釋解釋一下構(gòu)造器中的一些屬性的使用:
// components/Dialog/dialog.jsComponent({options: {multipleSlots:true// 在組件定義時(shí)的選項(xiàng)中啟用多slot支持},/**
? * 組件的屬性列表
? * 用于組件自定義設(shè)置
? */properties: {// 彈窗標(biāo)題title: {// 屬性名type:String,// 類型(必填)型酥,目前接受的類型包括:String, Number, Boolean, Object, Array, null(表示任意類型)value:'標(biāo)題'// 屬性初始值(可選),如果未指定則會(huì)根據(jù)類型選擇一個(gè)},// 彈窗內(nèi)容content :{type:String,value:'彈窗內(nèi)容'},// 彈窗取消按鈕文字cancelText :{type:String,value:'取消'},// 彈窗確認(rèn)按鈕文字confirmText :{type:String,value:'確定'}? },/**
? * 私有數(shù)據(jù),組件的初始數(shù)據(jù)
? * 可用于模版渲染
? */data: {// 彈窗顯示控制isShow:false},/**
? * 組件的方法列表
? * 更新屬性和數(shù)據(jù)的方法與更新頁面數(shù)據(jù)的方法類似
? */methods: {/*
? ? * 公有方法
? ? *///隱藏彈框hideDialog(){this.setData({isShow: !this.data.isShow? ? ? })? ? },//展示彈框showDialog(){this.setData({isShow: !this.data.isShow? ? ? })? ? },/*
? ? * 內(nèi)部私有方法建議以下劃線開頭
? ? * triggerEvent 用于觸發(fā)事件
? ? */_cancelEvent(){//觸發(fā)取消回調(diào)this.triggerEvent("cancelEvent")? ? },? ? _confirmEvent(){//觸發(fā)成功回調(diào)this.triggerEvent("confirmEvent");? ? }? }})
step4
截至目前為止查乒,你應(yīng)該完成了一個(gè)自定義彈窗組件的大部分弥喉,可是你保存后并沒有發(fā)現(xiàn)任何變化,因?yàn)槲覀冞€需要在index.wxml文件中引入它玛迄!
首先需要在index.json中引入組件:
{"usingComponents": {"dialog":"/components/Dialog/dialog"}}
然后我們?cè)趇ndex.wxml中引入它由境,并增加我們自定義的一些值,如下
ClickMe!
嗯哪蓖议,還差最后一步虏杰,index.js配置,沒錯(cuò)勒虾,這個(gè)也很簡(jiǎn)單纺阔,我就復(fù)制粘貼了
//index.js//獲取應(yīng)用實(shí)例constapp = getApp()Page({/**
* 生命周期函數(shù)--監(jiān)聽頁面初次渲染完成
*/onReady:function(){//獲得dialog組件this.dialog =this.selectComponent("#dialog");? },? showDialog(){this.dialog.showDialog();? },//取消事件_cancelEvent(){console.log('你點(diǎn)擊了取消');this.dialog.hideDialog();? },//確認(rèn)事件_confirmEvent(){console.log('你點(diǎn)擊了確定');this.dialog.hideDialog();? }})
到此!大功告成修然!
step5
讓我們測(cè)試一下試試看:
初始化
點(diǎn)擊按鈕之后呢笛钝,會(huì)出現(xiàn)如下效果:
彈窗出現(xiàn)
點(diǎn)擊取消或者確定按鈕的話,我們?cè)谑录性O(shè)置了彈窗會(huì)關(guān)閉低零,并會(huì)打印出相應(yīng)的信息婆翔,具體點(diǎn)擊完應(yīng)該怎么做,就看你們自己發(fā)揮了掏婶,我只能幫你到這里了~
點(diǎn)擊取消
點(diǎn)擊確定
總結(jié)
現(xiàn)在啃奴,你已經(jīng)基本掌握了小程序中的自定義組件開發(fā)技巧,怎么樣雄妥,是不是很棒最蕾,應(yīng)該給自己點(diǎn)個(gè)贊,打個(gè)call老厌。
總體來說瘟则,小程序推出自定義組件后,感覺方便了很多枝秤,還沒有 get 的小伙伴們醋拧,趕緊學(xué)習(xí)學(xué)習(xí),以后多用組件化開發(fā),就不會(huì)那么難受了丹壕,加油哦~
具體代碼庆械,我已經(jīng)托管到github上了,歡迎issue~
作者:Cryptic
鏈接:http://www.reibang.com/p/8a2a730d9e60
來源:簡(jiǎn)書
著作權(quán)歸作者所有菌赖。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)缭乘,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。